在 Java 中,**Proxy(代理)**通常指两种层面:
下面从使用场景和典型例子来说明 Java Proxy 适合什么场景。
当你想在方法调用前后做一些统一处理,但不想修改原代码时
典型场景:
示例:
public interface UserService {
void save();
}
代理中统一加日志:
Proxy.newProxyInstance(
loader,
new Class[]{UserService.class},
(proxy, method, args) -> {
System.out.println("before");
Object result = method.invoke(target, args);
System.out.println("after");
return result;
}
);
✅ 适合:接口 + 横切逻辑
调用方不关心实现在哪里
典型例子:
UserService userService = rpcProxy.create(UserService.class);
userService.getUser(1);
✅ 适合:接口即契约,实现在远端
对象创建成本高,用到时才创建
例子:
Proxy.newProxyInstance(..., (p, m, a) -> {
if (real == null) real = createHeavyObject();
return m.invoke(real, a);
});
✅ 适合:资源昂贵、使用不确定
控制对真实对象的访问权限
例子:
✅ 适合:权限控制
❌ 目标类没有接口
class UserService { } // ❌ 不能被 JDK Proxy 代理
✅ 类没有接口
✅ Spring AOP 默认方式之一
✅ 高性能方法拦截
⚠️ 限制:
final 类 / final 方法| 场景 | 说明 |
|---|---|
| 远程代理 | 隐藏网络细节 |
| 虚拟代理 | 延迟创建 |
| 保护代理 | 访问控制 |
| 缓存代理 | 方法结果缓存 |
| 日志代理 | 统一日志 |
| 事务代理 | 方法级事务 |
Java Proxy 适合:对“接口行为”做统一增强、解耦调用方与实现方、控制访问或延迟加载的场景。
如果你愿意,我可以:
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。