反射作用
知道对象有什么,是否可以用,通过字节码对象用于获取对象里面的构造器,字段,方法,具有可扩展的功能.
编写通用代码
字节码对象:
用Class创建的对象,加载在内存中就已经创建了
创建字节码的三种方法
全限定名获取方法:copy类的类名:“cn.wolfcode._02_class.User”
1.Class.forName(“全限定名”),使用较多
Class clz = Class.forName("cn.wolfcode._02_class.User");
2.对象.getClass()
User u=new User();
u.getClass();
3.类名.class
Class clz=User.class;
注意:三种字节码对象是同一个
获取构造器
有Declared的是可以获取私有的构造器,私有的方法,私有的字段
最后单词跟了s的是获取所有
创建字节码对象
Class<User> clz=User.class;
1.获取所有的公共构造器(返回的是数组)
Constructor<?>[] constructors = clz.getConstructors()
2.获取所有公共的,私有的构造器(返回的是数组)
Constructor<?>[] declaredConstructors =clz.getDeclaredConstructors()
3…获取一个公共无参构造器
Constructor<User> constructor = clz.getConstructor();
4.获取一个指定类型的构造器
Constructor<User> declaredConstructor1 = clz.getDeclaredConstructor(String.class);
使用构造器创建对象
可以操作私有的构造器
公共构造器创建对象
1.创建字节码对象
Class<User> clz =(Class<User>) Class.forName("cn.wolfcode._03_constructor.User");
2.获取构造器
Constructor<User> constructor = clz.getConstructor(String.class, int.class);
3.传入实参
User u3 = constructor.newInstance("张三", 24);
私有构造器创建对象
//私有构造器
Constructor<User> declaredConstructor2 = clz.getDeclaredConstructor(int.class);
//暴力反射;设置构造器的可访问性,突破访问权限的限制
declaredConstructor2.setAccessible(true);
User u4 = declaredConstructor2.newInstance(10);
使用反射获取方法
使用反射操作类里面的方法
1.获取公共的和继承过来的方法(返回数组)
//创建字节码对象
Class<User> clz = User.class;
//获取公共的和继承过来的方法
Method[] methods = clz.getMethods();
2.获取自己所有的方法(返回数组)
Method[] declaredMethods = clz.getDeclaredMethods()
3.获取一个公共的方法
Method dowork = clz.getMethod("dowork", String.class);
4.获取一个私有方法
Method dowork2 = clz.getDeclaredMethod("dowork2");
使用反射调用方法
通过Class中的newInstance调用无参的方法创建对象
User user =clz.newInstance()
//参数:调用对象的方法,实参是什么
公共的调用
dowork.invoke(user,"xxxxx");
私有的调用
//暴力反射
dowork2.setAccessible(true);
dowork2.invoke(user);