Java反射
Java 反射(Reflection)详细教学
1. 什么是 Java 反射?
Java 反射(Reflection) 是 Java 语言中的一个重要机制,它允许程序在运行时动态获取类的信息,并创建对象、调用方法、访问和修改字段,即使在编译时类的具体类型未知。
反射的作用:
- 获取类的结构信息(类名、构造方法、字段、方法等)。
- 动态创建对象(即使没有显式地写
new
)。 - 动态调用对象的方法。
- 访问或修改对象的字段(包括私有字段)。
- 用于开发通用框架,如 Spring、MyBatis、Hibernate 等。
2. 反射的核心类
反射主要依赖 java.lang.reflect
包中的几个核心类:
类 | 作用 |
---|---|
Class<?> |
代表 Java 中的类或接口(每个类都有一个 Class 对象)。 |
Constructor<T> |
代表类的构造方法,可以用来创建对象。 |
Method |
代表类的方法,可以用来调用方法。 |
Field |
代表类的字段(成员变量),可以用来获取或修改字段的值。 |
3. 获取 Class 对象
在 Java 反射机制中,所有的类都会有一个 Class
对象,我们可以通过以下三种方式获取它。
方式 1:使用 Class.forName()
1 | Class<?> clazz = Class.forName("java.util.ArrayList"); |
适用于: 知道类的全限定名(包名+类名),常用于动态加载类。
方式 2:使用 类名.class
1 | Class<?> clazz = ArrayList.class; |
适用于: 已知类,但不需要创建实例。
方式 3:使用 对象.getClass()
1 | List<String> list = new ArrayList<>(); |
适用于: 已有对象,想获取它的类信息。
4. 获取类的信息
反射可以获取类的基本信息,如类名、包名、父类、接口等。
示例
1 | import java.lang.reflect.Modifier; |
输出:
1 | 类名:ArrayList |
5. 通过反射创建对象
反射可以动态创建对象,使用 newInstance()
或 Constructor
类。
方式 1:使用 Class.newInstance()
1 | Class<?> clazz = Class.forName("java.util.ArrayList"); |
适用于: 需要创建无参构造方法的实例。
方式 2:使用 Constructor.newInstance()
1 | import java.lang.reflect.Constructor; |
适用于: 需要调用有参构造创建对象。
6. 通过反射访问字段
反射可以访问和修改私有或公共字段(变量)。
示例
1 | import java.lang.reflect.Field; |
输出:
1 | 原始值:默认名字 |
注意: setAccessible(true)
允许访问私有字段。
7. 通过反射调用方法
可以使用 Method.invoke()
动态调用方法,包括私有方法。
示例
1 | import java.lang.reflect.Method; |
输出:
1 | 你好, 李四 |
8. 反射与 ClassLoader
反射可以动态加载类,配合 ClassLoader
进行热加载,常用于插件机制和框架开发。
示例
1 | ClassLoader classLoader = ClassLoader.getSystemClassLoader(); |
9. 反射的应用场景
框架开发
(如 Spring、MyBatis):
- 反射用于依赖注入,如
Spring
的@Autowired
。 - 动态代理(AOP)基于反射实现。
- 反射用于依赖注入,如
JVM 调试与工具
:
- 反射用于开发
IDE
插件,如IntelliJ IDEA
插件。
- 反射用于开发
动态加载类
:
- 适用于插件系统,例如 Minecraft 插件、Tomcat 动态加载 Web 应用。
序列化与反序列化
:
- JSON 库(如 Jackson、Gson)基于反射解析对象。
10. 总结
🔹 反射允许运行时获取类信息、创建对象、调用方法、访问字段。
🔹 常用类包括 Class<?>
、Constructor<?>
、Method
和 Field
。
🔹 反射用于框架开发、动态代理、插件系统。
🔹 反射会降低性能,应谨慎使用,必要时使用 缓存
机制优化。
🚀 掌握反射,你就掌握了 Java 的动态魔法!
本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来源 Kai Xin 的小世界!
评论