小鲁哥哥白话笔记-反射(二)上一次给大家讲了讲反射的一些概念和基本的用法,相信同学都已经对反射有了初步的了解,今天我们来深入的了解一下反射的其他应用。
我们上一篇讲了如何获取对象和public修饰的成员变量,那我们如何获取类中用private修饰的成员变量和方法呢。反射机制给我们提供了一套可以获取私有的方法,我们称之为暴力反射。
暴力反射一共有5个步骤:
1. 获取学生类字节码对象
2. 获取学生对象
3. 通过getDeclaredField方法获取私有字段
4. 通过setAccessible让jvm不检查权限
5. 通过set方法设置对象为具体的值
给大家演示一下,并做具体的说明:
[Java] 纯文本查看 复制代码
package com.itheima_01;
import java.lang.reflect.Field;
/*
* 通过反射获取私有成员变量并使用
* Field[] getDeclaredFields()
* Field getDeclaredField(String name)
*/
public class ReflectDemo4 {
public static void main(String[] args) throws ReflectiveOperationException {
//获取学生类的字节码对象
Class clazz = Class.forName("com.itheima_01.Student");
//获取学生对象
Object stu = clazz.newInstance();
//获取私有的字段对象
Field f = clazz.getDeclaredField("name");
f.setAccessible(true);//设置反射时取消Java的访问检查,暴力访问
f.set(stu, "lisi");//设置
Object name = f.get(stu);
System.out.println(name);
}
}
上边讲的是如何获取成员变量,我们在给大家讲一讲如何获取成员方法:
[Java] 纯文本查看 复制代码
// 获取字节码对象
Class clazz = Class.forName("com.heima.Student");
// 创建学生对象
Object stu = clazz.newInstance();
// 暴力反射获取方法
Method method = clazz.getDeclaredMethod("method");
// 让jvm不检查权限
method.setAccessible(true);
// 执行方法
method.invoke(stu);
大家能看到,获取成员方法的步骤和获取成员变量的步骤差不多,都是先通过字节码文件获取对象,再通过对象获取私有方法,设置允许暴力访问权限,执行方法。
上诉就是通过暴力反射来获取对象的私有的成员变量和成员方法。我们只有理解了反射的概念和用法才能更深刻的理解反射的意义。这样才有助于我们在实际工作中的开发中灵活运用反射技术来解决我们开发中的难题。