admin管理员组文章数量:1446753
java中常用反射的API及作用
1. Class
类
作用:反射的入口,表示一个类或接口的类型信息。 常用方法:
Class.forName(String className)
通过类全限定名(如"java.lang.String"
)加载类,返回Class
对象。
Class<?> clazz = Class.forName("java.util.ArrayList");
clazz.newInstance()
通过默认无参构造函数创建类的实例(已废弃,推荐使用Constructor.newInstance()
)。clazz.getDeclaredConstructors()
获取类的所有构造函数(包括私有构造函数)。clazz.getDeclaredMethods()
获取类的所有方法(包括私有方法)。clazz.getDeclaredFields()
获取类的所有字段(包括私有字段)。
2. Constructor
类
作用:表示类的构造函数,用于动态创建对象。 常用方法:
constructor.newInstance(Object... args)
通过构造函数参数创建实例。
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)
调用对象的指定方法。
Method addMethod = clazz.getDeclaredMethod("add", Object.class);
addMethod.invoke(list, "Hello"); // list.add("Hello")
method.setAccessible(true)
访问私有方法。
4. Field
类
作用:表示类的字段(成员变量),用于动态读写字段值。 常用方法:
field.get(Object obj)
获取对象的字段值。
Method addMethod = clazz.getDeclaredMethod("add", Object.class);
addMethod.invoke(list, "Hello"); // list.add("Hello")
field.set(Object obj, Object value)
设置对象的字段值。
5. Modifier
类
作用:解析类、方法或字段的修饰符(如 public
、static
)。 常用方法:
Modifier.isPublic(int mod)
判断修饰符是否包含public
。
int modifiers = method.getModifiers();
boolean isPublic = Modifier.isPublic(modifiers);
6. Array
类
作用:动态创建和操作数组。 常用方法:
Array.newInstance(Class<?> componentType, int length)
创建数组。
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
:高级反射操作(不推荐直接使用)。
注意事项
- 性能开销:反射操作比直接调用方法慢(JIT 优化有限),避免高频使用。
- 访问限制:通过
setAccessible(true)
可以访问私有成员,但可能破坏封装性。 - 安全性:反射可能绕过安全检查,需谨慎使用(如禁止在安全管理器中操作)。
通过反射 API,开发者可以在运行时动态加载类、创建对象、调用方法、读写字段,实现高度灵活的逻辑(如 Spring 框架的依赖注入)。但需权衡灵活性与性能、安全性。
本文标签: java中常用反射的API及作用
版权声明:本文标题:java中常用反射的API及作用 内容由网友自发贡献,该文观点仅代表作者本人, 转载请联系作者并注明出处:http://www.betaflare.com/biancheng/1748234063a2830131.html, 本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容,一经查实,本站将立刻删除。
发表评论