在 Java 中,Proxy(代理) 主要有以下几种含义和用途,最常见的是 JDK 动态代理(java.lang.reflect.Proxy),此外还有 CGLIB 代理、静态代理 等。下面重点说明 Java 动态代理的作用和使用场景。
Proxy 的核心作用:
在不修改原有类代码的前提下,对目标对象的方法进行增强(拦截、控制、扩展)。
简单说:
你调用的是“代理对象”,但实际执行的是“真实对象”,中间可以加逻辑。
最典型的例子就是 Spring AOP。
例如:
public Object invoke(Object proxy, Method method, Object[] args) {
System.out.println("前置逻辑");
Object result = method.invoke(target, args);
System.out.println("后置逻辑");
return result;
}
✅ 不需要改业务代码
@Transactional
public void transfer() {
...
}
Spring 就是通过 Proxy 在方法前后自动管理事务。
long start = System.currentTimeMillis();
Object result = method.invoke(target, args);
long end = System.currentTimeMillis();
System.out.println("耗时:" + (end - start));
例如:
userService.getUser()proxy.getUser(id) → 网络请求 → 远程服务
Proxy.newProxyInstance(...)
只有在真正调用方法时才去加载真实对象。
public class UserServiceImpl implements UserService {
}
Proxy.newProxyInstance(
classLoader,
new Class[]{UserService.class},
invocationHandler
);
| 对比项 | JDK Proxy | CGLIB |
|---|---|---|
| 原理 | 接口代理 | 继承类 |
| 是否需接口 | ✅ 必须 | ❌ 不需要 |
| 性能 | 稍慢 | 稍快 |
| Spring 使用 | 有接口时用 | 无接口时用 |
interface Service {
void say();
}
class RealService implements Service {
public void say() {
System.out.println("hello");
}
}
Service proxy = (Service) Proxy.newProxyInstance(
RealService.class.getClassLoader(),
new Class[]{Service.class},
(p, method, args) -> {
System.out.println("before");
Object r = method.invoke(new RealService(), args);
System.out.println("after");
return r;
}
);
proxy.say();
Java Proxy 的作用:在运行期为接口创建代理对象,用来对方法调用进行统一拦截和增强。
如果你愿意,我也可以:
你想看哪一种?
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。