如何使用java反射
获取 Class 对象
Java 反射操作的第一步是获取目标类的 Class 对象。可以通过三种方式实现:
Class.forName("全限定类名")动态加载类对象.getClass()通过实例获取类名.class直接通过类获取
Class<?> clazz = Class.forName("java.util.ArrayList");
创建实例
通过 Class 对象可以创建类的实例,包括调用无参构造器和带参构造器:
// 无参构造
Object listInstance = clazz.newInstance();
// 带参构造
Constructor<?> constructor = clazz.getConstructor(int.class);
Object initializedList = constructor.newInstance(10);
访问字段
反射可以获取和修改类的字段值,包括私有字段:
Field sizeField = clazz.getDeclaredField("size");
sizeField.setAccessible(true); // 突破私有限制
int sizeValue = (int) sizeField.get(listInstance);
调用方法
通过反射可以调用对象的方法,包括静态方法和实例方法:
Method addMethod = clazz.getMethod("add", Object.class);
addMethod.invoke(listInstance, "test element");
Method staticMethod = clazz.getMethod("staticMethodName");
staticMethod.invoke(null); // 静态方法传null
处理泛型
反射会擦除泛型信息,需要通过 ParameterizedType 获取真实类型:
Type genericType = field.getGenericType();
if (genericType instanceof ParameterizedType) {
Type[] actualTypes = ((ParameterizedType)genericType).getActualTypeArguments();
}
性能优化
反射操作比直接调用慢,可以通过缓存反射对象提高性能:
// 缓存Method对象
private static final Method CACHED_METHOD;
static {
CACHED_METHOD = clazz.getMethod("methodName");
}
安全考虑
使用反射时应注意安全管理器检查,通过 setAccessible(true) 可能引发安全异常:
try {
field.setAccessible(true);
} catch (SecurityException e) {
// 处理权限问题
}
动态代理
结合反射可以实现动态代理模式:

InvocationHandler handler = (proxy, method, args) -> {
// 前置处理
Object result = method.invoke(target, args);
// 后置处理
return result;
};
Proxy.newProxyInstance(loader, interfaces, handler);






