一、什么是反射
反射(Reflection) 被视为动态语言的关键。反射机制允许Java程序在运行过程中获取内部的信息并能直接操作任意对象。反射可以换一种方式获取对象 对象的属性 对象的构造方法 对象的方法。
二、获取Class对象
Java的每个类文件运行后都会生成一个字节码文件(class),这个class文件包含了类中所有的信息(属性,方法,构造方法)。Java通过字节码文件可以将他转换成Class对象。
class Person{
属性;
方法;
构造方法;
}
public class Demo {
public static void main(String[] args) throws ClassNotFoundException {
//三种获取Class对象的方式:
//1.类.class 获取
Class<Person> personClass = Person.class;
System.out.println(personClass);
//2.Class.forName 通过类的全限定名字来获取类所对应的CLass对象
Class<?> aClass = Class.forName("包名.Person");
System.out.println(aClass);
//3. 通过对象来创建Class对象
Class<? extends Person> aClass1 = new Person().getClass();
System.out.println(aClass1);
//代码走到这一步 已经获取了Person.class字节码文件对象
//Person.class字节码文件 存了好多的类的信息,挨个取出来即可
}
}
三、获取Constructor对象
通过Class对象调用方法获取构造方法:
Constructor<T> getConstructor() //获取类的公共构造函数
Constructor<?>[] getConstructors() //获取类的所有公共构造函数
Constructor<T> getDeclaredConstructor() //获取类的某个任意的构造方法(包括私有的)
Constructor<?>[] getDeclaredConstructors() //获取类的所有任意构造方法(包括私有的)
通过Constructor对象调用的方法:
newInstance(对象结构方法对应的数据)
//使用此Constructor对象表示的构造函数
//使用指定的初始化参数来创建和初始化构造函数的声明类的新实例
四、获取Method对象
通过Class对象调用方法获取方法:
方法 getMethod() //返回一个公共的成员方法
方法[] getMethods() //返回一个包含所有公共成员方法的数组(包括继承的方法)
方法 getDeclaredMethod() //返回一个任意的成员方法
方法[] getDeclaredMethods() //返回一个包含所有成员方法的数组(不包括继承的方法)
通过Method对象调用的方法:
Object invoke(类名, 方法的实参); //使用方法对象.invoke(),方法会执行
//另外,如果是执行私有的方法,需要:
方法名.setAccessible(true);
五、获取Field对象
通过Class对象调用方法获取:
Field getField(String name)
//返回一个Field对象,它反映此表示的类或接口的一个公共成员属性
Field[] getFields()
//返回一个Field对象数组,它反映此表示的类或接口的所有公共成员属性
Field getDeclaredField(String name)
//返回一个Field对象,它反映此表示的类或接口的一个任意成员属性(包括私有的)
Field[] getDeclaredField()
//返回一个Field对象数组,它反映此表示的类或接口的所有成员属性
通过Field对象调用的方法:
void set(类名, 数据) //通过属性.set()将数据赋值给属性
//另外,如果是执行私有的属性,需要:
方法名.setAccessible(true);