反射
什么是反射?
反射是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法;对于任意一个对象都能够调用它的任意一个方法和属性;这种动态获取的信息以及动态调用对象的方法的功能称为反射。
好处:
-
可以在程序运行过程中,操作对象。
-
可以解耦,提高程序的可扩展性。
获取Class对象的方式
Class.forName(“全类名”): 将字节码文件加载进内存,返回Class对象。
*多用于配置文件,将类名定义在位置文件中。读取文件,加载进内存
类名.class: 通过类名的属性class获取。
*多用于参数的传递
对象.getClass(): getClass()方法在Object类中定义着。
*多用于对象的获取字节码的方式
代码案例:
Class cla1 = Class.forName("com.itcly.domain.Person");
System.out.println(cla1);
Class<Person> cla2 = Person.class;
System.out.println(cla2);
Person person = new Person();
Class<? extends Person> cla3 = person.getClass();
System.out.println(cla3);
System.out.println(cla1==cla2);
System.out.println(cla1==cla3);
结果:
class com.itcly.domain.Person
class com.itcly.domain.Person
class com.itcly.domain.Person
true
true
同一个字节码文件(*.class)再一次程序运行过程中,只会被加载一次,不论通过哪一种方式获取的Class对象都是同一个。
Class对象功能
获取功能
1. 获取成员变量们
*Field[] getFields() :获取所有public修饰的成员变量
*Field getField(String name) :获取指定名称的public修饰的成员变量
*Field[] getDeclaredFields() 获取所有的成员变量,不考虑修饰符
*Field getDeclaredField(String name) <font color="red">需要暴力反射</font>
2.获取构造方法
*Constructor<?>[] getConstructors()
*Constructor<T> getConstructor(类<?>... parameterTypes)
*Constructor<T> getDeclaredConstructor(类<?>... parameterTypes)
*Constructor<?>[] getDeclaredConstructors()
3.获取成员方法
*Method[] getMethods()
*Method getMethod(String name, 类<?>... parameterTypes)
*Method[] getDeclaredMethods()
*Method getDeclaredMethod(String name, 类<?>... parameterTypes)
4.获取全类名
* Field:成员变量
* 操作:
1. 设置值
* void set(Object obj, Object value)
2. 获取值
* get(Object obj)
3. 忽略访问权限修饰符的安全检查
* setAccessible(true):暴力反射
* Constructor:构造方法
* 创建对象:
* T newInstance(Object... initargs)
* 如果使用空参数构造方法创建对象,操作可以简化:Class对象的newInstance方法
* Method:方法对象
* 执行方法:
* Object invoke(Object obj, Object... args)
* 获取方法名称:
* String getName:获取方法名