Java基础 - 反射

类加载器

类加载器介绍

反射是什么

反射(Reflection)是 Java 提供的一种能力,它允许程序在运行时检查和操作类、对象、方法、构造函数、字段等程序结构。

反射的作用:

  • Java 框架(比如 Spring、Hibernate)并不知道你会写哪些类,它必须在运行时“扫描”你的类、方法、注解,然后自动做一些操作。这必须靠反射。

  • 一个软件支持插件,需要在运行时加载新插件类,也要用反射。
    插件可以看作一个 .jar 文件,添加插件时,放到特定的文件夹。主程序运行的时候,会扫描这个文件夹。主程序用自定义类加载器加载插件 jar 文件,然后通过反射调用插件里的代码。

  • 测试框架(JUnit)依赖反射。

    1
    2
    3
    4
    @Test
    public void testLogin() {
    // 测试登录逻辑
    }

    JUnit 并不事先知道你写了哪些测试类和测试方法。它运行的时候,扫描所有类,找出有 @Test 注解的方法,实例化类对象,调用这些方法。

  • 序列化 / 反序列化工具依赖反射。
    序列化是把对象转换成可以存储或传输的格式(如 JSON、XML、二进制)。反序列化是反过来。

比如反序列化时,将 JSON 转换成Java对象(JSON介绍):

1
2
// {"name": "Alice", "age": 20}
Person person = new Person(); // name = "Alice", age = 20

我们从 JSON 字符串中知道 “name” 字段,但程序怎么知道它对应哪个 Java 字段?这时要通过反射。

JAVA反射的原理

Class对象

类加载器介绍提到,类加载器在堆中创建一个 Class 对象来存储类的信息。反射正是通过获取Class实例来获取到类的所有信息。

获取一个类的Class实例的方法:

  1. 通过类名访问

    1
    Class<?> clazz = String.class;
  2. 通过类的完整类名

    1
    Class<?> clazz = Class.forName("java.lang.String");
  3. 通过对象的 getClass() 方法

    1
    2
    String str = "Hello";
    Class<?> clazz = str.getClass();

Class对象的常见操作

1
2
3
4
5
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基础 - 反射
https://thiefcat.github.io/2025/07/05/JAVA/reflection/
Author
小贼猫
Posted on
July 5, 2025
Licensed under