JAVA基础 反射
我们都知道自然界中光可以进行反射,JAVA有着一个非常突出的动态相关机制:Reflection。java中的反射也同光的反射有一样的原理的。是通过溯源到Class类,然后利用Class类的属性和方法就可以进一步利用到其他具体类的属性和方法。就像光通过湖面反射到各个地方。因此,获取源头Class也是重难点。
实现功能
①在运行时判断任意一个对象所属的类;
②在运行时构造任意一个类的对象;
③在运行时判断任意一个类所具有的成员变量和方法;
④在运行时调用任意一个对象的方法;
⑤生成动态代理;
获取源头Class
1.类名.class
2.Class.forName(权限定名) -->推荐
3.对象.getClass()
4.根据一个子类获取父类的Class对象.
Class objClass = cls1.getSuperclass();
System.out.println(Object.class == objClass);
获取构造器
1>构造器 getConstructor(类<?>… parameterTypes) 返回一个 构造器对象,该对象反映此 类对象所表示的类的指定公共构造函数。
2>构造器<?>[] getConstructors() 返回一个包含 构造器对象的数组, 构造器对象反映了此 类对象所表示的类的所有公共构造函数。
3>构造器 getDeclaredConstructor(类<?>… parameterTypes) 返回一个 构造器对象,该对象反映此 类对象所表示的类或接口的指定构造函数。
4>构造器<?>[] getDeclaredConstructors() 返回 构造器对象的数组, 构造器对象反映由此 类对象表示的类声明的所有构造函数。
创建对象
1.通过Class类的newInstance调用某一个类型的空构造为对象出现初始化信息创建对象 -->弃用
2.调用构造器类型的newInstance方法,创建对象的时候指定调用当前的 构造器为对象初始化信息
setAccessible(true); //忽略权限
反射的操作属性和方法
操作属性
字段 getField(String name) 返回 字段对象,该对象反映此 类对象表示的类或接口的指定公共成员字段。
字段[] getFields() 返回一个包含 字段对象的数组, 字段对象反映此 类对象所表示的类或接口的所有可访问公共字段。
字段 getDeclaredField(String name) 返回 字段对象,该对象反映此 类对象表示的类或接口的指定声明字段。
字段[] getDeclaredFields() 返回 字段对象的数组, 字段对象反映由此 类对象表示的类或接口声明的所有字段。
Object get(Object obj) 返回指定对象上此 字段表示的字段的值。
void set(Object obj, Object value) 将指定对象参数上此 字段对象表示的字段设置为指定的新值。
操作方法
getDeclaredMethod(String name, 类<?>… parameterTypes) 返回 方法对象,该对象反映此 类对象表示的类或接口的指定声明方法。
方法[] getDeclaredMethods()
方法 getMethod(String name, 类<?>… parameterTypes) 返回 方法对象,该对象反映此 类对象表示的类或接口的指定公共成员方法。
方法[] getMethods() 返回一个包含 方法对象的数组, 方法对象反映此 类对象所表示的类或接口的所有公共方法,包括由类或接口声明的那些以及从超类和超接口继承的那些。
Object invoke(Object obj, Object… args) 在具有指定参数的指定对象上调用此 方法对象表示的基础方法。
操作数组
public static void main(String[] args) {
//反射操作数组
//构建数组
int[] arr = (int[]) Array.newInstance(int.class,7);
//static void set(Object array, int index, Object value) 将指定数组对象的索引组件的值设置为指定的新值。
Array.set(arr,0,5);
System.out.println(Arrays.toString(arr));
//static Object get(Object array, int index) 返回指定数组对象中索引组件的值。
System.out.println(Array.get(arr,2));
System.out.println(arr.getClass().isArray());
System.out.println("".getClass().isArray());
}