反射机制
1、反射概述:
JAVA反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意一个方法和属性;这种动态获取的信息以及动态调用对象的方法的功能称为java语言的反射机制。
要想解剖一个类,必须先要获取到该类的字节码文件对象。而解剖使用的就是Class类中的方法.所以先要获取到每一个字节码文件对应的Class类型的对象.
获取Class对象的三种方式:
1、 Person p = new Person();
Class c = p.getClass();
2、 Class c2 = Person.class; // 任意数据类型都具备一个class静态属性,看上去要比第一种方式简单.
3、 Class c3 = Class.forName("Person"); // 这里的字符串必须是类的全路径
// 将类名作为字符串传递给Class类中的静态方法forName即可
分析第三种和前两种的区别:
前两种你必须明确Person类型.
后者只需要知道类的字符串形式,扩展性更强。按照配置文件加载就可以了。
2、通过反射获取构造方法并使用
第一种方式获取对象:
Class——newInstance(); // 创建此 Class 对象所表示的类的一个新实例,该对象是通过无参构造new出来的。具有局限性,不能使用多参构造。
第二种方式获取对象:(可以通过有参构造进行new)
Constructor ——public T newInstance(Object ... initargs) // 创建带参构造所对应的对象
public Constructor<?>[] getConstructors() // 获取所有公共构造方法
public Constructor<?>[] getDeclaredConstructors() // 获取所有构造方法
public Constructor<T> getConstructor(Class<?>... parameterTypes) // 获取指定构造方法
参数为,构造方法的参数类型的class
public Constructor<T> getDeclaredConstructor(Class<?>... parameterTypes) // 获取指定构造方法,(可以是任意权限的构造方法)
public void setAccessible(boolean flag) // 设置忽略权限,拿构造不需要忽略权限,但是使用构造需要忽略权限
3、通过反射获取属性并使用
获取属性:
public Field[] getFields() // 获取所有公共属性(字段,成员变量)
public Field[] getDeclaredFields() // 获取所有的属性
public Field getField(String name) // 获取指定公共属性
public Field getDeclaredField(String name) // 获取指定属性名称的属性对象
使用属性:
Field ——public void set(Object obj, Object value) // 给对象设置值
第一个参数:对象,第二个参数是值。
4、通过反射获取方法并使用
获取方法:
getMethods 获取所有公共方法 包含继承的方法
getDeclaredMethods 获取所有方法 不包含继承的方法
getMethod 获取指定公共方法
getDeclaredMethod 获取指定方法
强制访问,私有方法method.setAccessible(true);
使用方法:
invoke(Object obj, Object... args)