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()
获取类的所有字段(包括私有字段)。Constructor
类作用:表示类的构造函数,用于动态创建对象。 常用方法:
constructor.newInstance(Object... args)
通过构造函数参数创建实例。Constructor<?> constructor = clazz.getDeclaredConstructor(int.class);
Object list = constructor.newInstance(10); // 创建 ArrayList(initialCapacity=10)
constructor.setAccessible(true)
突破访问限制(访问私有构造函数)。Method
类作用:表示类的方法,用于动态调用方法。 常用方法:
method.invoke(Object obj, Object... args)
调用对象的指定方法。Method addMethod = clazz.getDeclaredMethod("add", Object.class);
addMethod.invoke(list, "Hello"); // list.add("Hello")
method.setAccessible(true)
访问私有方法。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)
设置对象的字段值。Modifier
类作用:解析类、方法或字段的修饰符(如 public
、static
)。 常用方法:
Modifier.isPublic(int mod)
判断修饰符是否包含 public
。int modifiers = method.getModifiers();
boolean isPublic = Modifier.isPublic(modifiers);
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)
设置数组元素的值。Proxy
和 InvocationHandler
作用:实现动态代理,基于接口生成代理对象。 示例:
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"
ParameterizedType
:获取泛型类型参数(如 List<String>
中的 String
)。ReflectionFactory
:高级反射操作(不推荐直接使用)。setAccessible(true)
可以访问私有成员,但可能破坏封装性。通过反射 API,开发者可以在运行时动态加载类、创建对象、调用方法、读写字段,实现高度灵活的逻辑(如 Spring 框架的依赖注入)。但需权衡灵活性与性能、安全性。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。