Java反射

  • 反射:在运行时动态获取类的信息(如类名、方法、字段等)并操作这些信息的能力。反射允许程序在运行时检查和修改类的行为。通过反射可以获取一个类的所有属性和方法,并调用这些方法和属性。
  • 反射的核心:Class类。

1. 获取Class对象的方式

  • 知道具体类的情况下:
    1
    Class alunbarClass = TargetObject.class;
  • 通过Class.forName()传入类的路径获取:
    1
    Class alunbarClass = Class.forName("com.example.TargetObject");
  • 通过对象实例instance.getClass()获取:
    1
    2
    TargetObject targetObject = new TargetObject();
    Class alunbarClass = targetObject.getClass();
  • 通过类加载器获取:
    1
    ClassLoader.getSystemClassLoader().loadClass("com.example.TargetObject");

2. 反射的应用

  • 创建对线(调用构造器)
    1
    2
    3
    // 假设clazz是通过上述方式获取的Class对象
    Constructor<?> c = clazz.getConstructor(String.class);
    Object obj = c.newInstance("example");
  • 访问字段(Field)
    1
    2
    3
    4
    5
    Field f = clazz.getDeclaredField("name");
    f.setAccessible(true); // 如果是私有字段,需要设置可访问

    Object value = f.get(obj); // 获取字段值
    f.set(obj, "Tom"); //
  • 调用方法(Method)
    1
    2
    3
    4
    Method m = clazz.getDeclaredMethod("login", String.class);
    m.setAccessible(true); // 如果是私有方法,需要设置可访问

    m.invoke(obj, "myPassword"); // 调用方法

3. 反射的缺点

  • 性能开销:反射操作通常比直接代码调用慢,因为它涉及动态类型检查和方法查找。
  • 安全性问题:反射可以绕过访问控制检查,可能导致安全漏洞。
  • 可维护性差:过度使用反射会使代码难以理解和维护。