反射:
运行时期,对一个class文件,解剖,从class文件中获取出里面的成员,运行这些成员
解剖一个类的话,必须先要获取到这个类文件的对象
万物都是对象,编译后的class文件也是对象
JAVA提供了一个类, java.lang.Class 类,描述编译后的class文件这个对象的
成员:
构造方法也是对象,这个对象的描述类 java.lang.reflect.Constructor
成员变量也是对象,这个对象的描述类 java.lang.reflect.Field
成员方法也是对象,这个对象的描述类 java.lang.reflect.Method
解剖出一个类的成员,运行这些成员
A . 使用Class类,获取出被解剖的这个类的class文件对象
B . 使用Class类方法,获取出类中的所有成员
C . 将成员获取出来后,交给对应类,对应类中的方法,运行成员
如何获取,class文件对象
1. 使用类的对象获取
每个类都使用Object作为父类,Object类方法 getClass()
返回这个类的class文件对象,方法返回值Class类型对象
2. 使用类的静态属性获取
类名.class 返回这个类的class文件对象.属性运行结果也是Class类型对象
3. 使用Class类的静态方法获取
Class类静态方法 forName(String 类名) 传递字符串类名
获取到这个类的class文件对象,方法返回值也是Class类型对象
获取class文件中的构造方法,并运行
Class类的方法获取构造方法
Constructor<?>[] getConstructors() 获取class文件中的公共构造方法
Constructor<?> getConstructor(Class...p)获取指定参数的构造方法
运行获取到的构造方法-- Constructor
Constructor类方法运行,指定构造方法
Object newInstance(Object...obj)运行指定构造方法,传递实际参数
获取class文件中的私有构造方法并运行
Class类的方法获取构造方法
Constructor<?>[] getDeclaredConstructors()
Constructor<?> getDeclaredConstructor(Class...c)传递参数列表,获取指定私有构造方法
Constructor类有个父类AccessibleObject
方法 setAccessible(true) 暴力访问 (不建议使用,单例)
setAccessible 取消JAVA运行时期的访问限制检查
获取class文件中的成员变量,修改值
Class类的方法获取成员变量
Field[] getFields() 获取所有公共成员变量
Field getField(String 变量名) 传递字符串变量名,获取指定的成员变量
Field类的方法set修改获取到的成员变量值,必须有这个类的对象支持
set(Object obj,Object value)
获取class文件中的私有成员变量,修改值
Class类的方法获取私有成员变量
Field[] getDeclaredFields() 获取所有成员变量
Field getDeclaredField(String 变量名)获取指定的成员变量
Field父类方法setAccessible 暴力的访问
获取class文件中的成员方法,并运行
Class类的方法获取成员方法
Method[] getMethods() 获取所有公共成员方法,包括继承的
Method getMethod(String 方法名,Class...c)
获取指定的成员方法,传递字符串的方法名,传递的是Class类型的参数列表
Method类中,有一个方法,可以获取到通过反射获取的方法
invoke(Object obj,Object...value)
运行方法,必须有对象的支持, 调用方法传递的实际参数
获取class文件的私有成员方法,并运行
Class类的方法获取私有成员方法
Method[] getDeclaredMethods() 获取所有成员方法,不包括继承的
Method getDeclaredMethod(String,Class...c) 获取指定的成员方法
Method父类方法setAccessible 暴力的访问
|
|