张育辉
1:什么是反射
java反射机制是在运行状态中,可以获取对象的成员(成员方法和成员属性),可以调用成员方法;
2:获取字节码对象三种方式
1:可以通过对象.getClass();
2:类名.class;
3:Class.forName("全类名");
3:通过字节码对象获取构造对象
1:getConstructors() 获取一个类中所有的公共的构造方法,返回Constructors数组
2:getConstructor((可以有参数,不传就是空参数)) 根据参数获取指定的公共的构造方法, 返回Constructor对象
3:getDeclaredConstructor((可以有参数,不传就是空参数))获取私有的
4:通过字节码对象直接获取对象
获取对象,newInstance()空参newInstance()
Object obj = class.newInstance()
5:获取类中成员变量
1:getField(); public修饰的
2:getDeclardField() 获取所有的成员属性包括私有
需要调用setAccessible(true)方法,告诉JVM我要暴力访问,让jvm不检查权限
实例:反射private属性执行流程
1. 获取person类字节码对象 Class cl = Class.forName("com.itheima.demo.Person");
2. 获取person对象 Object person = cl.newInstance();
3. 通过getDeclaredField方法获取私有字段 Field f = cl.getDeclaredField("age");比如你要获取age私有属性
4. 通过setAccessible让jvm不检查权限 f.setAccessible(true);
5. 通过set方法设置对象为具体的值 f.set(person, 24);
6:获取成员方法
1:getMethod() 获取public修饰的成员方法 ,返回类型 Method对象,参数1是访问的方法名,参数2,是方法需要传的类型.class
调用方法 对象名.invoke() 参数1,对象名 参数2,你要传的参数
2:getDeclaredMethod() 获取所有修饰的成员方法,格式:同上
需要调用 setAccessible(true)让jvm不检查权限
执行方法 对象名.invoke() 参数1,对象名 参数2,你要传的参数 |