反射机制
2026/9/14大约 2 分钟
反射机制
反射:动态加载指定类并获取其中的所有内容,把字节码文件的内容封装成对象。
什么是反射
反射技术就是动态加载一个指定的类,并获取该类中的所有内容,将字节码文件中的内容都封装成对象,便于操作这些成员。简单说:反射技术可以对一个类进行解剖。
反射的好处
大大增强了程序的扩展性。
反射的基本步骤
- 获得 Class 对象:获得指定名称的字节码文件对象
- 实例化对象:获得类的属性、方法或构造函数
- 访问与调用:访问属性、调用方法、调用构造函数创建对象
获取 Class 对象的三种方式
获取 Class 对象的三种方式示例代码如下:
Java
// 方式一:Class.forName()(最常用,动态加载)
Class<?> clazz = Class.forName("com.example.Person");
// 方式二:类名.class
Class<?> clazz = Person.class;
// 方式三:对象.getClass()
Person p = new Person();
Class<?> clazz = p.getClass();Kotlin
// 方式一:Class.forName()(最常用,动态加载)
val clazz = Class.forName("com.example.Person")
// 方式二:类名.class(Kotlin 中用 ::class.java)
val clazz = Person::class.java
// 方式三:对象.javaClass
val p = Person()
val clazz = p.javaClass反射常用操作
反射的常用操作示例代码如下:
Java
// 创建实例
Object obj = clazz.getDeclaredConstructor().newInstance();
// 获取并调用方法
Method method = clazz.getDeclaredMethod("setName", String.class);
method.invoke(obj, "张三");
// 访问私有字段(需 setAccessible(true))
Field field = clazz.getDeclaredField("age");
field.setAccessible(true);
field.set(obj, 25);Kotlin
// 创建实例
val obj = clazz.getDeclaredConstructor().newInstance()
// 获取并调用方法
val method = clazz.getDeclaredMethod("setName", String::class.java)
method.invoke(obj, "张三")
// 访问私有字段(需 setAccessible(true))
val field = clazz.getDeclaredField("age")
field.isAccessible = true
field.set(obj, 25)在 Android 中的应用
- 插件化/热修复:动态加载 dex 中的类
- 反射访问系统隐藏 API(如
ActivityManager私有方法) - 注解处理与依赖注入框架(如 ButterKnife、EventBus 等框架底层)