今天,学习了一些Java反射机制,简单记录一下。
按我的理解,就是在运行时,运态的获取对象相关的一些信息:
- 对象的“类”型、哪些成员变量、哪些方法、成员变量的值、新建一个某个类的对象,等等;
目前,我能想到的一些应用场景:
- 各种对象(无论子类、父类、对接口的任一种实现)都扔进来,显式调用其方法等,不关心其内部具体实现。“扔进来,调,一视同仁,去个性化”
- 给一个对象,“制造仿品”,即新建类型的对象(对象数组等);
- 突破那个类对对象/方法的访问权限控制,破掉封装性(可访问private变量、方法),很黄很暴力;
【1】获得“类”型
Class<?> classType = Class.forName(“java.lang.String”);
Class<?> classType = MyTest.class;
Class<?> classType = object.getClass();
【2】构造函数,构造带参数的类的对象;
Constructor cons = classType.getConstructor(new Class[]{});
Object o = cons.newInstance(new Object[]{});
不带参数的,可以直接这样写:
Object o = classType.newInstance();
课外小拓展(新建某个类的带参数的对象):
Class[] argsClass = new Class[args.length]; //根据Object[] args建类
for(int i=0;i<args.length;i++){
argsClass[i] = args[i].getClass();
}
Constructor cons = classType.getConstructor(argsClass); //获取带有这此参数类型的构造函数
cons.newInstance(args);//传入对象,新建对象
【3】成员变量
Field[] fields = classType.getDeclaredFields();
Field field = classType.getDeclaredField(o);
field.get(o);
fileld.get(classType);//类的静态成员哦
field.getName();
field.getType();
【4】方法
Method[] methods = classType.getDeclaredMethods();
Method method = classType.getMethod(“add”,new Class[]{int.class, int.class});
methods.setAccessible(true);//太暴力了
Object result = method.invoke(o, new Object[]{1,2});
Object result = method.invoke(null, new Object[]{1,2});//执行静态方法
【5】动态数组
Object arr = Array.newInstance(classType, 10);
Array.set(arr, 1, “hello”);
String str = (String)Array.get(arr, 1);
int[] dims = new int[]{5, 10, 15};
Object arr = Array.newInstance(Integer.TYPE, 3);
Object arrObj = Array.get(arr, 3);//获得一个第[3]个二维数组[10][15]
Object arrObj2 = Array.get(arrayObj, 5);//获得一个第[5]个一组数组[15]
Array.setInt(arrayObj2, 10, 37);//设定第10个值是37
int[][][] arrayCast = (int[][][])arr;
System.out.println(arrayCast[3][5][10]);
【6】是否为某个类的实例
someclass.isInstance(obj);