在 Java 中,Proxy(代理)是一种设计模式,也是 Java 标准库提供的一套机制,用来在运行时创建代理对象,从而在不修改原始类代码的情况下,对方法调用进行拦截、增强或控制。
下面从“概念 → 分类 → 原理 → 示例 → 常见用途”来说明。
代理对象(Proxy):
对目标对象的一层“包装”,调用者先调用代理对象,代理对象再决定是否、如何调用真实对象。
核心目的:
特点
示例
interface UserService {
void save();
}
class UserServiceImpl implements UserService {
public void save() {
System.out.println("保存用户");
}
}
class UserServiceProxy implements UserService {
private UserService target;
public UserServiceProxy(UserService target) {
this.target = target;
}
public void save() {
System.out.println("开始事务");
target.save();
System.out.println("提交事务");
}
}
✅ 简单直观
❌ 接口一多,代理类爆炸
Java 官方支持两种动态代理方式:
特点
java.lang.reflect.Proxy核心类
Proxy.newProxyInstance(...)InvocationHandler示例
interface UserService {
void save();
}
class UserServiceImpl implements UserService {
public void save() {
System.out.println("保存用户");
}
}
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("方法前:" + method.getName());
Object result = method.invoke(target, args);
System.out.println("方法后:" + method.getName());
return result;
}
}
public class Test {
public static void main(String[] args) {
UserService userService = new UserServiceImpl();
UserService proxy = (UserService) Proxy.newProxyInstance(
userService.getClass().getClassLoader(),
new Class[]{UserService.class},
new LogHandler(userService)
);
proxy.save();
}
}
✅ 灵活、无侵入
❌ 只能代理接口
特点
Enhancer enhancer = new Enhancer();
enhancer.setSuperclass(UserService.class);
enhancer.setCallback((MethodInterceptor) (obj, method, args, proxy) -> {
System.out.println("before");
Object result = proxy.invokeSuper(obj, args);
System.out.println("after");
return result;
});
✅ Spring AOP
✅ 事务管理
✅ 权限校验
✅ 日志记录
✅ 远程调用(RPC)
✅ 接口限流、监控
Java Proxy 是一种在不修改原有代码的前提下,通过代理对象对方法调用进行拦截和增强的机制。
如果你愿意,我也可以:
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。