Java反射机制
反射核心概念
flowchart TD
subgraph 反射机制
class[Class对象]
constructor[Constructor]
method[Method]
field[Field]
end
获取Class对象
// 1. 类名.class
Class<?> clazz1 = String.class;
// 2. 对象.getClass()
String str = "";
Class<?> clazz2 = str.getClass();
// 3. Class.forName()
Class<?> clazz3 = Class.forName("java.lang.String");
核心操作示例
// 创建实例
Constructor<?> constructor = clazz.getConstructor(String.class);
Object instance = constructor.newInstance("test");
// 调用方法
Method method = clazz.getMethod("length");
int length = (int) method.invoke(instance);
// 访问字段
Field field = clazz.getDeclaredField("value");
field.setAccessible(true);
byte[] value = (byte[]) field.get(instance);
动态代理
interface Service {
void serve();
}
class RealService implements Service {
public void serve() {
System.out.println("实际服务");
}
}
Service proxy = (Service) Proxy.newProxyInstance(
Service.class.getClassLoader(),
new Class[]{Service.class},
(proxyObj, method, args) -> {
System.out.println("前置处理");
Object result = method.invoke(new RealService(), args);
System.out.println("后置处理");
return result;
}
);
性能考虑
- 反射调用比直接调用慢约50-100倍
- 缓存频繁使用的Class/Method对象
- 考虑使用MethodHandle替代
- 避免在性能关键路径使用
应用场景
- 框架设计(如Spring IOC)
- 动态代理(AOP实现)
- 通用工具类
- 注解处理器
- 序列化/反序列化