admin管理员组

文章数量:1446753

java中常用反射的API及作用

1. Class

作用:反射的入口,表示一个类或接口的类型信息。 常用方法

  • Class.forName(String className) 通过类全限定名(如 "java.lang.String")加载类,返回 Class 对象。
代码语言:javascript代码运行次数:0运行复制
Class<?> clazz = Class.forName("java.util.ArrayList");
  • clazz.newInstance() 通过默认无参构造函数创建类的实例(已废弃,推荐使用 Constructor.newInstance())。
  • clazz.getDeclaredConstructors() 获取类的所有构造函数(包括私有构造函数)。
  • clazz.getDeclaredMethods() 获取类的所有方法(包括私有方法)。
  • clazz.getDeclaredFields() 获取类的所有字段(包括私有字段)。

2. Constructor

作用:表示类的构造函数,用于动态创建对象。 常用方法

  • constructor.newInstance(Object... args) 通过构造函数参数创建实例。
代码语言:javascript代码运行次数:0运行复制
Constructor<?> constructor = clazz.getDeclaredConstructor(int.class);
Object list = constructor.newInstance(10); // 创建 ArrayList(initialCapacity=10)
  • constructor.setAccessible(true) 突破访问限制(访问私有构造函数)。

3. Method

作用:表示类的方法,用于动态调用方法。 常用方法

  • method.invoke(Object obj, Object... args) 调用对象的指定方法。
代码语言:javascript代码运行次数:0运行复制
Method addMethod = clazz.getDeclaredMethod("add", Object.class);
addMethod.invoke(list, "Hello"); // list.add("Hello")
  • method.setAccessible(true) 访问私有方法。

4. Field

作用:表示类的字段(成员变量),用于动态读写字段值。 常用方法

  • field.get(Object obj) 获取对象的字段值。
代码语言:javascript代码运行次数:0运行复制
Method addMethod = clazz.getDeclaredMethod("add", Object.class);
addMethod.invoke(list, "Hello"); // list.add("Hello")
  • field.set(Object obj, Object value) 设置对象的字段值。

5. Modifier

作用:解析类、方法或字段的修饰符(如 publicstatic)。 常用方法

  • Modifier.isPublic(int mod) 判断修饰符是否包含 public
代码语言:javascript代码运行次数:0运行复制
int modifiers = method.getModifiers();
boolean isPublic = Modifier.isPublic(modifiers);

6. Array

作用:动态创建和操作数组。 常用方法

  • Array.newInstance(Class<?> componentType, int length) 创建数组。
代码语言:javascript代码运行次数:0运行复制
int[] arr = (int[]) Array.newInstance(int.class, 5); // 等价于 new int[5]
  • Array.set(Object array, int index, Object value) 设置数组元素的值。

7. Proxy InvocationHandler

作用:实现动态代理,基于接口生成代理对象。 示例

代码语言:javascript代码运行次数:0运行复制
interface Hello { void say(); }

// 创建代理对象
Hello proxy = (Hello) Proxy.newProxyInstance(
    Hello.class.getClassLoader(),
    new Class[]{Hello.class},
    (proxyObj, method, args) -> {
        System.out.println("Before method call");
        return null; // 调用实际方法(此处简化)
    }
);
proxy.say(); // 输出 "Before method call"

8.其他工具类

  • ParameterizedType:获取泛型类型参数(如 List<String> 中的 String)。
  • ReflectionFactory:高级反射操作(不推荐直接使用)。

注意事项

  1. 性能开销:反射操作比直接调用方法慢(JIT 优化有限),避免高频使用。
  2. 访问限制:通过 setAccessible(true) 可以访问私有成员,但可能破坏封装性。
  3. 安全性:反射可能绕过安全检查,需谨慎使用(如禁止在安全管理器中操作)。

通过反射 API,开发者可以在运行时动态加载类、创建对象、调用方法、读写字段,实现高度灵活的逻辑(如 Spring 框架的依赖注入)。但需权衡灵活性与性能、安全性。

本文标签: java中常用反射的API及作用