在 Java 中,**Proxy(代理)**通常有两层含义,最常见的是 JDK 动态代理(java.lang.reflect.Proxy),另外也常和 CGLIB 代理、AOP 一起讨论。下面主要讲 JDK Proxy 能做什么,以及实际应用场景。
核心能力:在“不修改原有类代码”的前提下,对方法调用进行拦截和增强。
具体来说,Proxy 可以做到:
在目标方法执行前、后、异常时插入逻辑:
public Object invoke(Object proxy, Method method, Object[] args) {
System.out.println("方法执行前");
Object result = method.invoke(target, args);
System.out.println("方法执行后");
return result;
}
✅ 常用于:
Spring 的 @Transactional 本质就是 Proxy:
beginTransaction();
try {
method.invoke(target, args);
commit();
} catch (Exception e) {
rollback();
}
✅ 不用在业务代码里写事务
客户端调用本地接口,Proxy 把请求发到远程服务器:
interface UserService {
User getUser(int id);
}
Proxy 内部:
✅ 典型应用:
对象很重,但暂时用不到:
Proxy.newProxyInstance(...)
只有真正调用方法时才创建真实对象。
✅ 应用:
Proxy 控制是否允许调用某些方法:
if (!hasPermission()) {
throw new SecurityException();
}
✅ 应用:
方法结果缓存,避免重复计算:
if (cache.containsKey(key)) {
return cache.get(key);
}
✅ 应用:
❌ 只能代理接口
Proxy.newProxyInstance(
classLoader,
new Class[]{UserService.class},
handler
);
✅ 如果要代理类:
interface Service {
void doSomething();
}
class RealService implements Service {
public void doSomething() {
System.out.println("真实方法");
}
}
class ProxyHandler implements InvocationHandler {
private Object target;
public ProxyHandler(Object target) {
this.target = target;
}
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
System.out.println("代理增强");
return method.invoke(target, args);
}
}
Java Proxy 的本质:在不改动原代码的情况下,控制、增强、包装对象行为。
如果你愿意,我可以:
你想从哪方面深入?
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。