Java 中的 Proxy(代理) 通常指 Java 动态代理(Dynamic Proxy),它是 Java 反射机制的重要应用之一,主要用于在运行时动态生成代理类,从而在不修改原始类代码的情况下,对方法调用进行拦截和增强。
下面从 原理、实现方式、使用场景 三个方面说明。
代理对象代替真实对象接收方法调用,再由代理对象决定是否、如何调用真实对象。
调用关系如下:
客户端
↓
代理对象(Proxy)
↓(增强逻辑 + 调用)
真实对象(Real Object)
Java 动态代理主要依赖:
java.lang.reflect.Proxyjava.lang.reflect.InvocationHandlerInvocationHandler.invoke()public interface UserService {
void save();
}
public class UserServiceImpl implements UserService {
public void save() {
System.out.println("保存用户");
}
}
public class MyInvocationHandler implements InvocationHandler {
private Object target;
public MyInvocationHandler(Object target) {
this.target = target;
}
@Override
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
System.out.println("方法前增强");
Object result = method.invoke(target, args);
System.out.println("方法后增强");
return result;
}
}
UserService proxy = (UserService) Proxy.newProxyInstance(
UserService.class.getClassLoader(),
new Class[]{UserService.class},
new MyInvocationHandler(new UserServiceImpl())
);
proxy.save();
简化流程如下:
$Proxy0Proxy⚠️ Java 原生 Proxy 只能代理接口
interface如果需要代理类,需要使用:
| 对比项 | Java Proxy | CGLIB |
|---|---|---|
| 代理方式 | 接口 | 类 |
| 是否依赖接口 | 是 | 否 |
| 性能 | 较低 | 较高 |
| 使用复杂度 | 低 | 稍高 |
| Spring 默认 | 有接口用 Proxy | 无接口用 CGLIB |
Java Proxy 是通过反射在运行时生成接口代理类,将所有方法调用统一转发到 InvocationHandler,从而实现无侵入式功能增强。
如果你愿意,我也可以:
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。