Skip to content
On this page

反射

反射就是Reflection,Java的反射是指程序在运行期可以拿到一个对象的所有信息。

这种通过Class实例获取class信息的方法称为反射(Reflection)

获取一个class的Class实例

方法一:直接通过一个class的静态变量class获取

java
Class cls = String.class;

方法二:如果我们有一个实例变量,可以通过该实例变量提供的getClass()方法获取:

java
String s = "Hello";
Class cls = s.getClass();

方法三:如果知道一个class的完整类名,可以通过静态方法Class.forName()获取:

java
Class cls = Class.forName("java.lang.String");

访问字段

  • Field getField(name):根据字段名获取某个public的field(包括父类)
  • Field getDeclaredField(name):根据字段名获取当前类的某个field(不包括父类)
  • Field[] getFields():获取所有public的field(包括父类)
  • Field[] getDeclaredFields():获取当前类的所有field(不包括父类)
java
class Person {
    private String name;

    public Person(String name) {
        this.name = name;
    }

    public String getName() {
        return this.name;
    }
}
java
public class Main {
    public static void main(String[] args) throws Exception {
        Person p = new Person("Xiao Ming");
        System.out.println(p.getName()); // "Xiao Ming"

        // 通过反射获得 class
        Class c = p.getClass();
        // 获得字段
        Field f = c.getDeclaredField("name");

        // 设置私有字段可访问
        f.setAccessible(true);
        // 修改字段值
        f.set(p, "Xiao Hong");
        
        System.out.println(p.getName()); // "Xiao Hong"
    }
}