📜  反射 java (1)

📅  最后修改于: 2023-12-03 15:07:23.146000             🧑  作者: Mango

反射 Java

在 Java 中,反射是指能够在运行时检查、获取和修改任意一个类的内部属性、方法以及接口等信息的能力。Java 反射机制在许多框架和工具中都得到了广泛应用,如 Spring、Hibernate、JUnit 等。

反射的基本概念
  • Class 类:在 Java 中,每个对象都有一个对应的 Class 类,用于描述该对象的属性和方法等信息。Java 中使用 class 关键字定义一个类时也会被编译成 Class 类。
  • Java.lang.reflect 包:该包中的类提供了 Java 反射机制的核心类和方法。例如,Class 类代表一个类,Method 类代表一个方法,Field 类代表一个属性。
  • 反射的三个步骤:
    1. 获取要操作的类的 Class 类对象。
    2. 根据需要获取该类的属性、方法等信息。
    3. 执行操作。
反射的应用场景
  • 动态加载类和对象。
  • 在运行时检查和操作类的属性和方法,实现框架的灵活性和可插拔性。
  • 在编写通用类型的代码时,可以依据不同的类来实现不同的行为。
示例代码
import java.lang.reflect.*;

public class ReflectDemo {
    public static void main(String[] args) throws Exception {
        // 获取 String 类对应的 Class 类对象
        Class<?> clazz = String.class;

        // 获取 String 类的构造方法并创建对象
        Constructor<?> constructor = clazz.getConstructor(String.class);
        String str = (String) constructor.newInstance("Hello world");

        // 获取 String 类的 length 方法并调用
        Method lengthMethod = clazz.getMethod("length");
        int length = (int) lengthMethod.invoke(str);

        // 获取 String 类的 charAt 方法并调用
        Method charAtMethod = clazz.getMethod("charAt", int.class);
        char ch = (char) charAtMethod.invoke(str, 1);

        // 获取 String 类的 value 属性并获取其值
        Field valueField = clazz.getDeclaredField("value");
        valueField.setAccessible(true);
        char[] value = (char[]) valueField.get(str);

        // 输出结果
        System.out.println(str);           // "Hello world"
        System.out.println(length);        // 11
        System.out.println(ch);            // 'e'
        System.out.println(new String(value));   // "Hello world"
    }
}

该示例中,我们首先获取了 String 类对应的 Class 类对象,然后分别使用反射机制获取了该类的构造方法、方法、属性,并进行了调用和操作。最后输出了结果。这个例子只是反射机制的冰山一角,反射机制还可以用于很多其他的场景。