一:反射:通过字节码文件对象去使用成员
在有getConstructors() getDeclaredConstructors()
有D的时候是可以访问私有,有s是所有
用方法对象调用invoke方法,确定由哪个对象去执行方法本身
m.invoke(obj, 10);
1. 获取字节码文件对象的三种方式:
A.Object类的getClass()方法
Person p1 = new Person();
Class c1 = p1.getClass();
B.数据类型的静态class属性
Class c3 = Person.class;
C.Class类的静态方法forName()
Class c4 = Class.forName("westo.org.java.Person"); 这里的路径是带包的类名
2. Class c = Class.forName("westo.org.java.Person");
Constructor[] cons = c.getConstructors(); 获取这个类中的所有构造方法
Constructor[] cons2 = c.getDeclaredConstructors(); 获取这个类中多有的构造方法,包括私有
Object obj = con.newInstance(); 用获得的无参构造创建对象
Constructor con2 = c.getDeclaredConstructor(String.class, int.class, String.class);
con2.setAccessible(true); 取消访问修饰符的限制
如果要取得的Field是private的,那么就要调用setAccessible(true),否则会报错Object obj2 = con2.newInstance("陈奕迅", 45, "香港");
3.反射的使用步骤
Class:
成员变量 Field
构造方法 Constructor
成员方法 Method
class字节码文件对象 -- 去得到对应的成员对象 -- 通过该成员的对象调用方法使用
A.Field
1.Class c = Class.forName("westo.org.java.Person"); 创建字节码文件对象
2.Constructor con = c.getConstructor(); 获取构造方法
3.Object obj = con.newInstance(); 通过构造方法创建对象
4.Field[] fields = c.getFields(); 获取公共成员变量
5.Field[] fields2 = c.getDeclaredFields(); 获取公共成员变量,包括私有
6.Field f = c.getDeclaredField("name"); 传入变量名称返回指定的成员变量对象
f.setAccessible(true); 取消访问修饰符的限制
f.set(obj, "谢娜"); 传参
System.out.println(obj); 输出
B.Method
1.Class c = Class.forName("westo.org.java.Person"); 创建字节码文件对象
2.Constructor con = c.getConstructor(); 获取构造方法
3.Object obj = con.newInstance(); 通过构造方法创建对象
4.Method[] methods = c.getMethods(); 获取所有公共成员方法,包括父类的公共成员方法
public Method getDeclaredMethod(String name,Class<?>...parameterTypes)
参数一:方法名 参数二:方法参数类型.class 获取指定的方法,包括私有
5.Method m = c.getMethod("method"); 获取这个方法
m.invoke(obj); 使用obj这个对象调用m表示的方法
6. Method m4 = c.getDeclaredMethod("show",String.class,String.class);
m4.setAccessible(true);
m4.invoke(obj, "张杰","谢娜");
我给你ArrayList<Integer>的一个对象,我想在这个集合中添加一个字符串数据,如何实现呢?
//1.创建ArrayList类对应的字节码文件对象
ArrayList<Integer> arr = new ArrayList();
Class c = arr.getClass();
//2.通过字节码文件对象获取到add方法对象
Method addM = c.getDeclaredMethod("add", Object.class);
//3.调用add方法的对象,给集合中添加字符串
addM.invoke(arr, "java");
addM.invoke(arr, "world");
System.out.println(arr);