在 Java 中,“Proxy 代理”通常指 JDK 动态代理(java.lang.reflect.Proxy),也可能涉及 CGLIB / ByteBuddy / AspectJ 等代理方案。下面从性能、设计、使用方式、替代方案几个维度系统说明如何“优化 Proxy 代理”。
❌ 错误做法:
Proxy.newProxyInstance(...) // 每次调用都创建
✅ 正确做法:缓存代理类 / 代理实例
private static final Map<Class<?>, Object> PROXY_CACHE = new ConcurrentHashMap<>();
public static <T> T getProxy(Class<T> interfaceClass, InvocationHandler handler) {
return (T) PROXY_CACHE.computeIfAbsent(interfaceClass,
k -> Proxy.newProxyInstance(
k.getClassLoader(),
new Class[]{k},
handler
)
);
}
代理类生成和类加载是昂贵的
invoke 中的反射调用Method.invoke() 本身慢。
✅ 优化方式:
MethodgetMethodMethodHandle(JDK 7+)private final Method methodCache;
public Object invoke(Object proxy, Method method, Object[] args) {
if (method.equals(methodCache)) {
// 直接调用
}
}
代理层应只做:
❌ 不要:
| 方案 | 性能 | 限制 |
|---|---|---|
| JDK Proxy | 中 | 只能代理接口 |
| CGLIB | 高 | 不能代理 final |
| ByteBuddy | 极高 | 学习成本 |
| AspectJ | 编译期 | 最稳 |
✅ 性能排序(大致):
AspectJ > ByteBuddy > CGLIB > JDK Proxy
EnhancerEnhancer enhancer = new Enhancer();
enhancer.setSuperclass(UserService.class);
enhancer.setCallback(callback);
MethodInterceptor 而不是 InvocationHandlerspring:
aop:
proxy-target-class: true
❌
execution(* com.xxx..*(..))
✅
execution(* com.xxx.service.*Service.*(..))
@Around 精准控制如果:
✅ 使用:
Proxy 优化的核心不是“让代理更快”,而是“少代理、轻代理、缓存代理”。
如果你愿意,我可以:
你现在的 Proxy 用在什么场景?
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。