温馨提示×

温馨提示×

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

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

Java Proxy 代理能做什么

发布时间:2026-08-31 22:57:56 来源:亿速云 阅读:92 作者:小樊 栏目:编程语言

在 Java 里常说的 Proxy(代理) 通常有两层含义:

  1. 设计模式层面的代理模式
  2. Java 语言/标准库提供的动态代理(java.lang.reflect.Proxy)

下面从“能做什么”的角度系统说明。


一、Java Proxy 能解决什么问题

核心目的:在不修改原始类代码的前提下,增强或控制对目标对象的方法访问。

典型能力包括:

  • 方法前后增强(日志、计时、事务)
  • 权限控制 / 鉴权
  • 远程调用(RPC)
  • 延迟加载(懒加载)
  • 缓存
  • 异常处理统一化

二、Java 动态代理(重点)

Java 标准库提供的是 基于接口的动态代理:

Proxy.newProxyInstance(
    classLoader,
    interfaces,
    invocationHandler
);

1️⃣ 能做:方法拦截与增强

public 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("before: " + method.getName());
        Object result = method.invoke(target, args);
        System.out.println("after: " + method.getName());
        return result;
    }
}

使用:

UserService proxy = (UserService) Proxy.newProxyInstance(
    UserService.class.getClassLoader(),
    new Class[]{UserService.class},
    new LogHandler(new UserServiceImpl())
);

✅ 适合:

  • 日志
  • 监控
  • 事务
  • 安全校验

2️⃣ 能做:AOP(面向切面编程)

Spring AOP 的底层就是 Proxy:

  • JDK 动态代理(接口)
  • CGLIB(类)
@Transactional
public void save() {}

本质:

方法调用 → 代理 → 开启事务 → 调用真实方法 → 提交/回滚


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

UserService service = (UserService) Proxy.newProxyInstance(...);
service.getUser(1);

代理内部:

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

典型框架:

  • Dubbo
  • gRPC(思想类似)
  • RMI

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

Proxy.newProxyInstance(...)

第一次调用时才真正创建对象(如大图片、数据库连接)。


5️⃣ 能做:缓存代理

if (cache.containsKey(key)) {
    return cache.get(key);
}
Object result = method.invoke(target, args);
cache.put(key, result);

三、Java Proxy 的局限

❌ 只能代理接口

  • 不能代理普通类
  • 不能代理 final 类 / final 方法

✅ 替代方案:

  • CGLIB(基于继承)
  • Byte Buddy
  • AspectJ(编译期/字节码增强)

四、对比总结

能力 JDK Proxy CGLIB
代理接口 ✅ ✅
代理类 ❌ ✅
性能 一般 较高
Spring 默认 接口 类

五、一句话总结

Java Proxy 的本质:在方法调用链中“插一脚”,从而控制、增强或替换真实对象的行为。

如果你愿意,我也可以:

  • 用 Spring AOP 举例
  • 对比 JDK Proxy vs CGLIB
  • 手写一个 Mini RPC 框架
向AI问一下细节

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

AI
助
手