当前位置:首页 > 学习笔记 > Java教程 > Java教程 反射

Java教程 反射

刘广法2022年03月25日 08:37:22Java教程5130
Java教程 反射-第1张图片-刘广法IT博客

Java教程 反射

在Java中关于放射的相关描述:

1、反射就是通过Java类的各种成分(构造函数、成员属性、成员方法等)映射成一个个的Java对象。

反射相关的使用:

一、通过反射获取Class 类对象:

1、通过getClass(); 进行获取。

2、通过任意的数据类型进行获取Class 类

3、通过forName(String className); 进行获取

通过反射进行获取Class 类对象的实例:

package com.liuguangfa.fanshe;

/**
 * 反射的运用
 * 
 * @author Liu_Xiansheng
 *
 */
public class Student {
	private String name;
	private int age;

	public String getName() {
		return name;
	}

	public void setName(String name) {
		this.name = name;
	}

	public int getAge() {
		return age;
	}

	public void setAge(int age) {
		this.age = age;
	}

	/**
	 * main方法
	 * 
	 * @throws ClassNotFoundException
	 */
	public static void main(String[] args) throws ClassNotFoundException {

		// 通过Object.Class 进行获取类对象
		Class c1 = Student.class;

		// 通过实例化的对象进行获取类对象
		Student student = new Student();
		Class c2 = student.getClass();

		// 通过forName(String className); 进行获取类对象

		Class c3 = Class.forName("com.liuguangfa.fanshe.Student");

		System.out.println(c1 == c2);
		System.out.println(c2 == c3);
	}

}

Java控制台的输出结果为:

true

true

二、通过反射获取构造方法并且使用:

运用相关类:Constructor 类

调用构造函数的方法:newInstance();

获取构造方法:

1、批量获取所有的公有构造函数:

clazz.getConstructors();

2、批量获取所有的公有的、私有的构造函数:

clazz.getDeclaredConstructor();

3、获取公有的构造函数并且调用的方式:

clazz.getConstructor();

调用公有的构造函数的方法:

clazz.getConstructor().newInstance();

4、获取私有的构造函数并且调用的方式:

clazz.getConstructor();

调用私有的构造函数的方法(获取使用权限):

clazz.getConstructor().setAccessible(teue);

clazz.getConstructor().newInstance();


//通过电泳构造函数创建对象时,需要通过调用.getConstructor(); 方法的时候,里面填写构造函数类型,如:

String.class,创建新对象的时候.newInstance(); ,里面填写null,或者时对应的类型。

package com.liuguangfa.fanshe;

import java.lang.reflect.Constructor;
import java.lang.reflect.InvocationTargetException;

/**
 * 反射的运用
 * 
 * @author Liu_Xiansheng
 *
 */
public class Student {
	private String name;
	private int age;
	private boolean isGood;

	// 创建不同类型的构造器
	public Student() {
		System.out.println("调用的公有、无参数构造器");
	}

	public Student(String name) {
		System.out.println("调用公有 String 类型的name :" + name);
	}

	public Student(int age) {
		System.out.println("调用公有 int 类型的age :" + age);
	}

	public Student(String name, int age) {
		System.out.println("调用公有 Sting 类型的name " + name + ",int 类型的age :" + age);
	}

	private Student(boolean isGood) {
		System.out.println("调用私用 boolean :" + isGood);
	}

	/**
	 * main方法
	 * 
	 * @throws ClassNotFoundException
	 * @throws SecurityException
	 * @throws NoSuchMethodException
	 * @throws InvocationTargetException
	 * @throws IllegalArgumentException
	 * @throws IllegalAccessException
	 * @throws InstantiationException
	 */
	public static void main(String[] args) throws ClassNotFoundException, NoSuchMethodException, SecurityException,
			InstantiationException, IllegalAccessException, IllegalArgumentException, InvocationTargetException {
		// 创建Class对象
		Class clazz = Class.forName("com.liuguangfa.fanshe.Student");
		// 获取所有公有的构造函数
		System.out.println("***调用所有的公有的构造函数");
		Constructor[] conArrays = clazz.getConstructors();
		for (Constructor e : conArrays) {
			System.out.println(e);
		}
		// 获取所有公有私有默认受保护的构造函数
		System.out.println("***调用公有的、私有的构造函数");
		conArrays = clazz.getDeclaredConstructors();
		for (Constructor e : conArrays) {
			System.out.println(e);
		}
		// 调用公有、无参数的构造器
		System.out.println("***调用公有的、无参的构造函数");
		Constructor con = clazz.getConstructor(null);
		System.out.println(con);

		// 调用公有的、有参数的构造器,这里以String 类型的name,并调用
		System.out.println("***调用公有的、String类型构造函数");
		con = clazz.getConstructor(String.class);
		System.out.println(con);
		// 调用函数
		Object obj = con.newInstance("张三");
		Student stu = (Student) obj;
		System.out.println(stu);

		// 调用私有的构造器,并调用
		System.out.println("***调用私有的造函数");
		con = clazz.getDeclaredConstructor(boolean.class);
		System.out.println(con);
		// 调用函数
		con.setAccessible(true);
		obj = con.newInstance(true);
		stu = (Student) obj;
		System.out.println(stu);
	}

}

Java控制台的输出:

***调用所有的公有的构造函数
public com.liuguangfa.fanshe.Student(java.lang.String,int)
public com.liuguangfa.fanshe.Student(int)
public com.liuguangfa.fanshe.Student(java.lang.String)
public com.liuguangfa.fanshe.Student()
***调用公有的、私有的构造函数
private com.liuguangfa.fanshe.Student(boolean)
public com.liuguangfa.fanshe.Student(java.lang.String,int)
public com.liuguangfa.fanshe.Student(int)
public com.liuguangfa.fanshe.Student(java.lang.String)
public com.liuguangfa.fanshe.Student()
***调用公有的、无参的构造函数
public com.liuguangfa.fanshe.Student()
***调用公有的、String类型构造函数
public com.liuguangfa.fanshe.Student(java.lang.String)
调用公有 String 类型的name :张三
com.liuguangfa.fanshe.Student@72ea2f77
***调用私有的造函数
private com.liuguangfa.fanshe.Student(boolean)
调用私用 boolean :true
com.liuguangfa.fanshe.Student@33c7353a

三、通过反射获取成员变量并调用

获取成员属性的类:Field 类

package com.liuguangfa.fanshe;

import java.lang.reflect.Field;
import java.lang.reflect.InvocationTargetException;

/**
 * 反射的运用
 * 
 * @author Liu_Xiansheng
 *
 */
public class Student {
	public String name;
	private int age;

	// 创建不同类型的构造器
	public Student() {
		System.out.println("调用的公有、无参数构造器");
	}

	public Student(String name) {
		System.out.println("调用公有 String 类型的name :" + name);
	}

	public Student(int age) {
		System.out.println("调用公有 int 类型的age :" + age);
	}

	public Student(String name, int age) {
		System.out.println("调用公有 Sting 类型的name " + name + ",int 类型的age :" + age);
	}

	/**
	 * main方法
	 * 
	 * @throws ClassNotFoundException
	 * @throws SecurityException
	 * @throws NoSuchFieldException
	 * @throws NoSuchMethodException
	 * @throws InvocationTargetException
	 * @throws IllegalArgumentException
	 * @throws IllegalAccessException
	 * @throws InstantiationException
	 */
	public static void main(String[] args)
			throws ClassNotFoundException, NoSuchFieldException, SecurityException, InstantiationException,
			IllegalAccessException, IllegalArgumentException, InvocationTargetException, NoSuchMethodException {
		// 创建类对象
		Class clazz = Class.forName("com.liuguangfa.fanshe.Student");

		// 获取公有的成员属性并调用
		Field f = clazz.getField("name");
		// 通过反射创建新的学生实例
		Student stu = (Student) clazz.getConstructor().newInstance();
		// 通过反射赋值给创建的学生
		f.set(stu, "张三");
		System.out.println(stu.name);
		
		// 获取私有的成员属性调用
		f = clazz.getDeclaredField("age");
		f.setAccessible(true);
		f.set(stu, 22);
		System.out.println(stu.age);
		
		//获取所有的公有的成员属性
		System.out.println("获取所有的公有的的成员属性");
		Field [] fArrays =clazz.getFields();
		for(Field i:fArrays) {
			System.out.println(i);
		}
		
		//获取公有的的、私有的成员属性
		System.out.println("获取公有的、私有的成员属性");
		fArrays  = clazz.getDeclaredFields();
		for(Field i :fArrays) {
			System.out.println(i);
		}
	}

}

Java控制台的输出:

调用的公有、无参数构造器
张三
22
获取所有的公有的的成员属性
public java.lang.String com.liuguangfa.fanshe.Student.name
获取公有的、私有的成员属性
public java.lang.String com.liuguangfa.fanshe.Student.name
private int com.liuguangfa.fanshe.Student.age

四、通过反射获取成员方法并调用

获取成员方法的类:Method

package com.liuguangfa.fanshe;

import java.lang.reflect.Method;

/**
 * 反射的运用
 * 
 * @author Liu_Xiansheng
 *
 */
public class Student {
	public String name;
	private int age;

	// 创建公有的方法
	public String getName() {
		return name;
	}

	public void setName(String name) {
		this.name = name;
	}

	public int getAge() {
		return age;
	}

	public void setAge(int age) {
		this.age = age;
	}

	public void show1(String s) {
		System.out.println("调用show1方法,其中值为:" + s);
	}

	// 创建私有的方法
	private void show2(int show2Int) {
		System.out.println("调用show21方法,其中值为:" + show2Int);
	}

	/**
	 * main方法
	 * 
	 */
	public static void main(String[] args) throws Exception {
		// 创建类对象
		Class clazz = Class.forName("com.liuguangfa.fanshe.Student");
		// 调用所有公有的方法
		System.out.println("调用所有公有的、私有的方法");
		Method[] methodArrays = clazz.getDeclaredMethods();
		for (Method i : methodArrays) {
			System.out.println(i);
		}

		// 调用所有公有的方法
		System.out.println("调用所有公有的方法");
		methodArrays = clazz.getMethods();
		for (Method i : methodArrays) {
			System.out.println(i);
		}

		// 调用指定的公有方法,并调用
		System.out.println("调用指定的公有方法,并调用");
		Method m = clazz.getMethod("show1", String.class);
		Student stu = (Student) clazz.getConstructor().newInstance();// 创建学生对象
		m.invoke(stu, "刘广法博客你");

		// 调用指定的私有方法,并调用
		System.out.println("调用指定的私有方法,并调用");
		m = clazz.getDeclaredMethod("show2", int.class);
		m.setAccessible(true);// 解除限制
		m.invoke(stu, 22);

	}
}

Java控制台输出:

调用所有公有的、私有的方法
public java.lang.String com.liuguangfa.fanshe.Student.getName()
public void com.liuguangfa.fanshe.Student.setName(java.lang.String)
public int com.liuguangfa.fanshe.Student.getAge()
public void com.liuguangfa.fanshe.Student.show1(java.lang.String)
public void com.liuguangfa.fanshe.Student.setAge(int)
private void com.liuguangfa.fanshe.Student.show2(int)
调用所有公有的方法
public java.lang.String com.liuguangfa.fanshe.Student.getName()
public void com.liuguangfa.fanshe.Student.setName(java.lang.String)
public int com.liuguangfa.fanshe.Student.getAge()
public void com.liuguangfa.fanshe.Student.show1(java.lang.String)
public void com.liuguangfa.fanshe.Student.setAge(int)
public final void java.lang.Object.wait(long,int) throws java.lang.InterruptedException
public final void java.lang.Object.wait() throws java.lang.InterruptedException
public final native void java.lang.Object.wait(long) throws java.lang.InterruptedException
public boolean java.lang.Object.equals(java.lang.Object)
public java.lang.String java.lang.Object.toString()
public native int java.lang.Object.hashCode()
public final native java.lang.Class java.lang.Object.getClass()
public final native void java.lang.Object.notify()
public final native void java.lang.Object.notifyAll()
调用指定的公有方法,并调用
调用show1方法,其中值为:刘广法博客你
调用指定的私有方法,并调用
调用show21方法,其中值为:22

文章原创作者:刘广法,感谢转载,网站地址:https://liuguangfa.com/

扫描二维码推送至手机访问。

版权声明:本文由刘广法博客发布,如需转载请注明出处。

本文链接:https://liuguangfa.com/java/154.html

分享给朋友:

“Java教程 反射” 的相关文章

eclipse删除工作空间的详细步骤(图解)

eclipse删除工作空间的详细步骤(图解)

上一次我修改添加eclipce的工作空间,但只我的eclipce上有两个工作空间,今天我想删除一个第一步: Window > Preferences > General > startup and shutdown -->workspace这就是删除eclipse的...

eclipse 自动提示功能的实现

eclipse 自动提示功能的实现

之前用的版本都是有提示的,最近安装的最新版没有提示,今天就设置让自动提示出来第一步:windows”->"preferences",弹出preferences设置窗口。第二步:在preferences中找到Java,依次展开列表"Editor"->...

eclipse 修改默认的工作空间以及修改个人工作空间的编码

eclipse 修改默认的工作空间以及修改个人工作空间的编码

一、修改工作空间workspaceFile-->Awitch Workspace-->Other,就打开下面的图,然后选择我标起来的就可以新建工作空间了。二、设置工作空间workspace的编码为UTF-8设置完你所用的工作空间也就是上一步后,需要修改工作空间的编码为UTF-8步骤如下:...

Java练习:找出三位数中所有的水仙花的值

找到三位数中所有为水仙花的值1、水仙花:百位数的立方+十位数的地方+个位数的立方等于这个数本身。2、三位数中。具体的步骤:public static void main(String[] args) { int i =&nbs...

Java练习:从控制台输入一个年份,统计输入的年份到现在一共多少天?

从控制台输入一个年份,统计输入的年份到现在一共多少天?注意事项:1、平年365天,闰年十366天。2月份平年28天,2月份闰年29年。2、今年2022年3月14日3、闰年判断:能够被四百整数;能被4整数但不能被100整数public static void main(S...

Java练习:百钱百鸡利用Java进行实现

今有100块钱,需要购买100只鸡,已知鸡的价格是:公鸡5元,母鸡3元,小鸡三只元,问:需要购买多少只公鸡、母鸡、小鸡?Java实现百鸡百钱的方法一: public static void main(String[] args) { for&n...

Java教程 第六节:数组

数组数组:简单来说,就是一组相同数据类型的数。float[] score = new float[6];索引或者下标:必须是整数,不能为负。最大下标等于数组长度-1。float[0],就是float类型数据score的第一个项。数组的下标结合循环,可以简化对批...

Java练习:控制台输入十个成绩,编程对这些成绩取平均值,并判断出成绩最大值和成绩最小值

有控制台输入十个成绩,编程对这些成绩取平均值,并判断出成绩最大值和成绩最小值 public static void main(String[] args) { // 有控制台输入十个成绩,编程对这些成绩取平均值,并判断出成绩最大值和成...

Java教程第七节:选择排序法和和冒泡排序法

选择法排序:分为若干轮比较,每一轮找出一个最大值。刘广法整理思路:假设有数组{ 1, 2, 3, 5, 98, 24, 6, 456, 14 },假设第一个数字最大,然后从第二个开始依次和第一个比,如...

Java教程 第八节:方法

定义方法:返回值类型 函数名称(函数列表){       // 函数体,可以执行代码,可以是0行或者多行。}我们常见的 main 方法就是一个在Java中最常见的方法:public static viod main(String []arg...

Java练习:定义一个函数,计算两个整数的最大公约数

Java面试题:定义一个函数,计算两个整数的最大公约数本题关键点:最大的公约数能够被两个数都整除的数 public static void main(String[] args) { // 定义一个函数,计算两个整数的最大公约数...

关于Math.random();的说明

关于Math.random();的关系:一、随机产生某区间的数:int (Math.random() * (最大值 - 最小值) + 最小值)一、Math.random(); 在Java中式产生随机产生 [0,1) 之间的数创建一个方法:返回一个m~n 的值,包括m 但不包括 n ,如果返回 -1...

发表评论

访客

◎欢迎参与讨论,请在这里发表您的看法和观点。