🔍 反射(Reflection) 是Java语言中一个强大的功能,允许程序在运行时检查和操作类、对象、方法等元数据。它是实现框架(如Spring、Hibernate)和动态代理的核心技术之一。
核心概念
Class对象
- 每个类在JVM中都会生成一个
Class
对象,通过它可获取类的元信息。 - 示例:
Person.class
或Class.forName("java.lang.String")
- 每个类在JVM中都会生成一个
运行时获取信息
- 通过反射可动态获取类的构造方法、字段、注解等。
- 例如:
Method[] methods = clazz.getMethods(); Field field = clazz.getDeclaredField("name");
动态创建对象
- 使用
Class.newInstance()
或Constructor.newInstance()
实现实例化。
- 使用
访问私有成员
- 通过
setAccessible(true)
绕过访问控制权限。
- 通过
使用示例
🛠️ 基础用法
// 获取Class对象
Class<?> clazz = Class.forName("com.example.Person");
// 创建实例
Object instance = clazz.newInstance();
// 获取字段并设置值
Field field = clazz.getDeclaredField("age");
field.setAccessible(true);
field.set(instance, 25);
🛠️ 高级场景
- 动态调用方法:
Method method = clazz.getMethod("sayHello", String.class);
- 注解处理:遍历
Annotation[] annotations
获取元数据 - 通过
Field.getType()
获取字段类型信息
注意事项
⚠️ 安全限制
- 反射可能破坏封装性,需谨慎使用
setAccessible(true)
- 部分JVM实现对反射调用有性能开销
⚠️ 兼容性
newInstance()
在Java 9+已被弃用,建议使用getConstructor().newInstance()
扩展阅读
📚 想了解更多?可参考深入理解Java反射原理获取入门教程。