在 Java 里常说的 Proxy(代理) 通常有两层含义:
下面从“能做什么”的角度系统说明。
核心目的:在不修改原始类代码的前提下,增强或控制对目标对象的方法访问。
典型能力包括:
Java 标准库提供的是 基于接口的动态代理:
Proxy.newProxyInstance(
classLoader,
interfaces,
invocationHandler
);
public class LogHandler implements InvocationHandler {
private Object target;
public LogHandler(Object target) {
this.target = target;
}
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
System.out.println("before: " + method.getName());
Object result = method.invoke(target, args);
System.out.println("after: " + method.getName());
return result;
}
}
使用:
UserService proxy = (UserService) Proxy.newProxyInstance(
UserService.class.getClassLoader(),
new Class[]{UserService.class},
new LogHandler(new UserServiceImpl())
);
✅ 适合:
Spring AOP 的底层就是 Proxy:
@Transactional
public void save() {}
本质:
方法调用 → 代理 → 开启事务 → 调用真实方法 → 提交/回滚
UserService service = (UserService) Proxy.newProxyInstance(...);
service.getUser(1);
代理内部:
典型框架:
Proxy.newProxyInstance(...)
第一次调用时才真正创建对象(如大图片、数据库连接)。
if (cache.containsKey(key)) {
return cache.get(key);
}
Object result = method.invoke(target, args);
cache.put(key, result);
❌ 只能代理接口
✅ 替代方案:
| 能力 | JDK Proxy | CGLIB |
|---|---|---|
| 代理接口 | ✅ | ✅ |
| 代理类 | ❌ | ✅ |
| 性能 | 一般 | 较高 |
| Spring 默认 | 接口 | 类 |
Java Proxy 的本质:在方法调用链中“插一脚”,从而控制、增强或替换真实对象的行为。
如果你愿意,我也可以:
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。