- Java反射机制是在运行状态中,对于任意的一个类(class文件),都能知道这个类的所有属性和方法
- 对于任意一个对象,都能调用它的任意一个方法和属性
- 这种动态获取的信息以及动态调用对象的方法的功能称为Java反射机制,可以理解为对类的解剖
- 要想对字节码文件进行解剖,必须要有字节码文件对象
- 获取字节码文件对象的方式:
- 1、Object类中的getClass()方法,想要用这种方式,必须要明确具体的类,并创建对象
- 2、任何数据类型都具备一个静态属性.class来获取对应的Class对象,这相对简单,但还是要明确用到类中的静态成员
- 如已有Person类,则可以这样获取
- Class clazz = Person.class;
- 3、只要通过给定的类的字符串名称就可以获取该类,可以使用Class类中的方法完成,该方法就是forName()方法
- 如已有Person类,所在包名为com.qsx,则可以这样获取
- String className = "com.qsx.Person";
- Class clazz = Class.forName(className); //拿到字节码文件并加载进内存
- Object obj = clazz.newInstance(); //产生新实例对象
- 这种方式只要有名称即可,更为方便,扩展性更强。
- 通过构造函数进行初始化
- Constructor constructor = clazz.getConstructor(String.class,int.class); //假设Person类有个带String类型和int类型的构造函数 ,这里可以获取到指定的构造函数对象
- Object object = constructor.newInstance("小明",18); //通过构造对象的 的newInstance方法进行对象的初始化
- 获取字节码文件中的字段
- Field field = clazz.getField("age"); //Person类中含有名称为age的int 类型的字段,这只能拿public修饰的公有字段
- Field field = clazz.getDeclareedField("age"); //这方法能拿Person类中所有的字段,包括公有的、私有的、受保护的等等
- field.setAccessible(true); //对私有字段的访问取消权限检查
- Object obj = clazz.newInstance();
- field.set(obj,89); //设置值,相当于setAge()方法
- Object o = field.get(obj); //取到值,相当于getAge()方法
- 获取指定Class中的公共函数
- Method[] methods = clazz.getMethod(); //获取到一个方法的数组,只能获取到共有的方法
- method=clazz.getDeclaredMethods(); //能获取到本类中的所有方法,包含私有的,公有的,受保护的等
- for(Method method:methods){
- System.out.println(method); //循环遍历打印出来
- }
- Method method = clazz.getMethod("show",null); //获取空参数一般方法,show是Person中的空方法名,获取到一个方法
- method.invoke(obj,null); //运行前面获取的show方法
Java反射机制123
最新推荐文章于 2021-02-25 21:04:56 发布