温馨提示×

温馨提示×

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

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

Java Proxy 代理有哪些类型

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

在 Java 中,Proxy(代理)通常可以从实现方式和使用场景两个维度来分类。下面系统地给你梳理一下。


一、按实现方式分类(最常见分类)

1️⃣ 静态代理(Static Proxy)

特点

  • 代理类在编译期就已经存在
  • 手动编写代理类
  • 代理类和目标类通常实现同一接口

示例

interface Service {
    void doSomething();
}

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

class ProxyService implements Service {
    private RealService real = new RealService();
    public void doSomething() {
        System.out.println("前置处理");
        real.doSomething();
        System.out.println("后置处理");
    }
}

优点

  • 简单、直观
  • 性能较好

缺点

  • 代理类多,维护成本高
  • 不够灵活

2️⃣ 动态代理(Dynamic Proxy)

(1)JDK 动态代理(基于接口)

特点

  • 由 java.lang.reflect.Proxy 在运行期生成
  • 只能代理接口

示例

Proxy.newProxyInstance(
    loader,
    new Class[]{Service.class},
    (proxy, method, args) -> {
        System.out.println("前置");
        return method.invoke(real, args);
    }
);

优点

  • 无需手写代理类
  • 适合 AOP、RPC 等场景

缺点

  • 只能代理接口
  • 反射调用,性能略低(JDK 8+ 已优化)

(2)CGLIB 动态代理(基于继承)

特点

  • 通过继承目标类生成子类代理
  • 可以代理普通类(无需接口)

示例

Enhancer enhancer = new Enhancer();
enhancer.setSuperclass(RealService.class);
enhancer.setCallback((MethodInterceptor) (obj, method, args, proxy) -> {
    System.out.println("前置");
    return proxy.invokeSuper(obj, args);
});

优点

  • 可代理类
  • Spring AOP 默认方案之一

缺点

  • 不能代理 final 类 / 方法
  • 生成字节码,稍重

(3)其他字节码增强方式(高级)

  • Byte Buddy
  • Javassist
  • ASM

常用于:

  • 框架底层
  • 监控、链路追踪
  • 热部署

二、按使用目的 / 场景分类

3️⃣ 远程代理(Remote Proxy)

  • 代表远程对象(如 RMI、RPC)
  • 调用像本地方法

4️⃣ 虚拟代理(Virtual Proxy)

  • 延迟创建开销大的对象
  • 如图片懒加载

5️⃣ 保护代理(Protection Proxy)

  • 控制访问权限

6️⃣ 缓存代理(Cache Proxy)

  • 缓存方法结果

7️⃣ AOP 代理(Spring Proxy)

  • 事务、日志、安全
  • 本质仍是 JDK / CGLIB 代理

三、对比总结表

类型 实现方式 是否需接口 典型应用
静态代理 手写类 是 简单包装
JDK 动态代理 反射 是 Spring AOP
CGLIB 继承 否 Spring AOP
字节码工具 ASM等 否 框架底层

如果你愿意,我也可以:

  • 用 Spring AOP 角度讲代理
  • 对比 JDK vs CGLIB 源码级差异
  • 给你一个 面试版回答模板

你想看哪一个?

向AI问一下细节

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

AI
助
手