好的,阿杰,我帮你用 大白话整理一份关于 Java 反射(Reflection) 的入门教程,包含 概念、使用方法、原理,让你轻松理解。
Java 反射(Reflection)大白话指南
1️⃣ 反射是什么?
- 简单理解:反射就是 在程序运行时“窥探”和操作类的能力”
- 换句话说:
- 你写好了一个类,但运行时不知道具体类长啥样?
- 你想动态创建对象、调用方法、修改属性?
- 这就需要 反射
通俗比喻:
反射就像你拿着放大镜去看一个盒子(类)里有什么东西(属性、方法),还可以偷偷改里面的东西。
2️⃣ 反射能干啥?
功能 | 举例 |
---|---|
获取类信息 | 类名、包名、父类、接口 |
获取成员信息 | 属性、方法、构造器 |
动态创建对象 | 不用 new ,运行时生成对象 |
调用方法 | 动态调用某个方法 |
操作属性 | 读写私有属性 |
3️⃣ 反射入门用法
3.1 获取 Class
对象
Class<?> clazz1 = Class.forName("com.example.User"); // 通过全类名
Class<User> clazz2 = User.class; // 通过类名
User user = new User();
Class<? extends User> clazz3 = user.getClass(); // 通过对象
- Class 就是类的运行时“元信息”
3.2 创建对象
User user = clazz1.getDeclaredConstructor().newInstance();
- 动态生成对象,不用写
new User()
- 如果构造器有参数:
Constructor<User> constructor = clazz1.getDeclaredConstructor(String.class, int.class);
User user = constructor.newInstance("Alice", 20);
3.3 获取和修改属性
Field field = clazz1.getDeclaredField("name"); // 私有属性也可以
field.setAccessible(true); // 打开私有权限
field.set(user, "Bob"); // 修改属性
String name = (String) field.get(user); // 获取属性
3.4 调用方法
Method method = clazz1.getDeclaredMethod("sayHello", String.class);
method.setAccessible(true); // 私有方法也能调用
method.invoke(user, "World"); // 调用方法
3.5 获取类结构信息
System.out.println("类名:" + clazz1.getName());
for (Field f : clazz1.getDeclaredFields()) {
System.out.println("属性:" + f.getName());
}
for (Method m : clazz1.getDeclaredMethods()) {
System.out.println("方法:" + m.getName());
}
4️⃣ 反射原理大白话解释
- Class 对象
- 每个类在运行时都会对应一个
Class
对象 - JVM 内部用它保存类的信息(方法、字段、父类等)
- 每个类在运行时都会对应一个
- 动态调用
- 通过
Method.invoke()
,JVM 找到方法内存地址并执行 - 就像游戏里动态点击按钮而不是直接编写代码
- 通过
- 私有访问
setAccessible(true)
直接修改 JVM 的访问检查- 有点像越过门卫,直接打开房间里的东西
- 反射 vs 普通代码
- 普通代码:编译期就确定了类和方法
- 反射:运行期才知道类和方法
- 优势:灵活、动态
- 劣势:性能慢、容易破坏封装
5️⃣ 注意事项
- 性能问题
- 反射比普通调用慢 2~5 倍
- 不适合高频调用场景
- 安全问题
- 私有权限可以被打开,要注意安全边界
- 泛型类型信息会擦除
- 反射拿到的只是
List
,具体类型List<String>
不可直接获取
- 反射拿到的只是
6️⃣ 小结
- 反射是万能钥匙:可以动态操作类、对象、方法、属性
- 优点:灵活、可扩展、支持框架(Spring、MyBatis、JUnit 都用反射)
- 缺点:性能慢、破坏封装、使用不当容易报错
一句话大白话总结:
反射就是“在运行时偷看并操作类的内部结构”,让你可以写更灵活、更通用的程序,但也要小心别用多了拖慢性能或者破坏封装。
发表回复