✅ 反射(Reflection)
反射 是 Java 提供的一种机制,可以在运行时动态获取类的信息、构造对象、调用方法、访问字段等。
✅ 通俗理解:反射就像“开外挂”,让你在运行时访问类的结构(包括私有的),甚至可以动态操作!
✅ 反射能干什么?
功能 |
举例说明 |
获取类的对象 |
Class cls = Class.forName("类的全路径"); |
创建对象 |
Object obj = cls.newInstance(); |
获取字段/方法/构造器 |
Field 、Method 、Constructor |
访问私有成员 |
通过 setAccessible(true) 绕过访问控制 |
调用方法 |
method.invoke(obj, 参数); |
✅ 获取 Class 对象的三种方式
1 2 3 4 5 6 7 8 9
| Class<?> cls1 = String.class;
String str = "hello"; Class<?> cls2 = str.getClass();
Class<?> cls3 = Class.forName("java.lang.String");
|
✅ 示例:使用反射调用方法
目标类:
1 2 3 4 5 6 7
| public class Person { private String name = "张三";
public void sayHello() { System.out.println("Hello, I am " + name); } }
|
反射调用:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
| import java.lang.reflect.Method;
public class ReflectTest { public static void main(String[] args) throws Exception { Class<?> cls = Class.forName("Person");
Object obj = cls.newInstance();
Method method = cls.getMethod("sayHello");
method.invoke(obj); } }
|
✅ 访问私有属性
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
| import java.lang.reflect.Field;
public class ReflectFieldTest { public static void main(String[] args) throws Exception { Class<?> cls = Class.forName("Person"); Object obj = cls.newInstance();
Field nameField = cls.getDeclaredField("name"); nameField.setAccessible(true); nameField.set(obj, "李四");
Method method = cls.getMethod("sayHello"); method.invoke(obj); } }
|
✅ 常用类
类名 |
功能 |
Class |
表示类的字节码 |
Field |
表示成员变量 |
Method |
表示成员方法 |
Constructor |
表示构造方法 |
✅ 反射的优缺点
优点 |
缺点 |
灵活、动态 |
效率低(反射开销大) |
可以访问私有成员 |
安全性较差 |
常用于框架、工具开发 |
不建议频繁使用 |
✅ 应用场景
- Java 框架(Spring、Hibernate 等)
- 工具类(如 BeanUtils)
- 动态加载类、插件系统
- 序列化、反序列化
- 注解处理器