Java基础 - 反射
类加载器
反射是什么
反射(Reflection)是 Java 提供的一种能力,它允许程序在运行时检查和操作类、对象、方法、构造函数、字段等程序结构。
反射的作用:
-
Java 框架(比如 Spring、Hibernate)并不知道你会写哪些类,它必须在运行时“扫描”你的类、方法、注解,然后自动做一些操作。这必须靠反射。
-
一个软件支持插件,需要在运行时加载新插件类,也要用反射。
插件可以看作一个.jar文件,添加插件时,放到特定的文件夹。主程序运行的时候,会扫描这个文件夹。主程序用自定义类加载器加载插件 jar 文件,然后通过反射调用插件里的代码。 -
测试框架(JUnit)依赖反射。
@Test
public void testLogin() {
// 测试登录逻辑
}JUnit 并不事先知道你写了哪些测试类和测试方法。它运行的时候,扫描所有类,找出有 @Test 注解的方法,实例化类对象,调用这些方法。
- 序列化 / 反序列化工具依赖反射。
序列化是把对象转换成可以存储或传输的格式(如 JSON、XML、二进制)。反序列化是反过来。
比如反序列化时,将 JSON 转换成Java对象(JSON介绍):
// {"name": "Alice", "age": 20}
Person person = new Person(); // name = "Alice", age = 20我们从 JSON 字符串中知道 “name” 字段,但程序怎么知道它对应哪个 Java 字段?这时要通过反射。
JAVA反射的原理
Class对象
在类加载器介绍提到,类加载器在堆中创建一个 Class 对象来存储类的信息。反射正是通过获取Class实例来获取到类的所有信息。
获取一个类的Class实例的方法:
- 通过类名访问
Class<?> clazz = String.class;- 通过类的完整类名
Class<?> clazz = Class.forName("java.lang.String");- 通过对象的
getClass()方法
String str = "Hello";
Class<?> clazz = str.getClass();Class对象的常见操作
String className = clazz.getName(); // "java.lang.String"
Constructor<?> constructor = clazz.getConstructor(String.class);
Method method = clazz.getMethod("substring", int.class, int.class);
Field field = clazz.getDeclaredField("value");
Object obj = clazz.getConstructor().newInstance(); // 创建对象Java基础 - 反射
http://example.com/2025/07/05/JAVA_basis/reflection/