温馨提示×

温馨提示×

您好,登录后才能下订单哦!

密码登录×
登录注册×
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》

java Proxy代理能做什么

发布时间:2026-09-19 12:12:30 来源:亿速云 阅读:98 作者:小樊 栏目:编程语言

在 Java 中,**Proxy(代理)**通常有两层含义,最常见的是 JDK 动态代理(java.lang.reflect.Proxy),另外也常和 CGLIB 代理、AOP 一起讨论。下面主要讲 JDK Proxy 能做什么,以及实际应用场景。


一、Java Proxy 能做什么?

核心能力:在“不修改原有类代码”的前提下,对方法调用进行拦截和增强。

具体来说,Proxy 可以做到:

1️⃣ 方法拦截(AOP 基础)

在目标方法执行前、后、异常时插入逻辑:

public Object invoke(Object proxy, Method method, Object[] args) {
    System.out.println("方法执行前");
    Object result = method.invoke(target, args);
    System.out.println("方法执行后");
    return result;
}

✅ 常用于:

  • 日志
  • 权限校验
  • 参数校验
  • 性能监控

2️⃣ 事务管理(Spring 核心原理)

Spring 的 @Transactional 本质就是 Proxy:

beginTransaction();
try {
    method.invoke(target, args);
    commit();
} catch (Exception e) {
    rollback();
}

✅ 不用在业务代码里写事务


3️⃣ 远程调用(RPC / 远程代理)

客户端调用本地接口,Proxy 把请求发到远程服务器:

interface UserService {
    User getUser(int id);
}

Proxy 内部:

  • 序列化参数
  • 网络请求
  • 反序列化结果

✅ 典型应用:

  • Dubbo
  • gRPC(部分)
  • Web Service

4️⃣ 延迟加载(虚拟代理)

对象很重,但暂时用不到:

Proxy.newProxyInstance(...)

只有真正调用方法时才创建真实对象。

✅ 应用:

  • 大对象
  • 数据库连接
  • 图片加载

5️⃣ 安全控制(保护代理)

Proxy 控制是否允许调用某些方法:

if (!hasPermission()) {
    throw new SecurityException();
}

✅ 应用:

  • 后台管理
  • 接口鉴权

6️⃣ 缓存代理

方法结果缓存,避免重复计算:

if (cache.containsKey(key)) {
    return cache.get(key);
}

✅ 应用:

  • 接口结果缓存
  • 方法级缓存

二、JDK Proxy 的限制(很重要)

❌ 只能代理接口

Proxy.newProxyInstance(
    classLoader,
    new Class[]{UserService.class},
    handler
);

✅ 如果要代理类:

  • 用 CGLIB
  • 或 Byte Buddy
  • Spring 会自动选择

三、典型使用结构

interface Service {
    void doSomething();
}

class RealService implements Service {
    public void doSomething() {
        System.out.println("真实方法");
    }
}

class ProxyHandler implements InvocationHandler {
    private Object target;

    public ProxyHandler(Object target) {
        this.target = target;
    }

    public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
        System.out.println("代理增强");
        return method.invoke(target, args);
    }
}

四、总结一句话

Java Proxy 的本质:在不改动原代码的情况下,控制、增强、包装对象行为。

如果你愿意,我可以:

  • 用 Spring AOP 对比讲
  • 写 完整可运行示例
  • 讲 JDK Proxy vs CGLIB
  • 结合 面试角度讲

你想从哪方面深入?

向AI问一下细节

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

AI
助
手