【Java学习】动态代理有哪些形式?

Java动态代理的两种主要形式

动态代理在Java中有两种主要的实现方式,它们各有特点和使用场景:

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

特点

  • Java标准库自带的功能(java.lang.reflect.Proxy
  • 只能代理接口,不能代理普通类
  • 运行时动态生成代理类
  • 性能较好

使用场景

  • 当你的类已经实现了接口时
  • Spring AOP默认使用这种方式

示例代码

java 复制代码
// 接口
interface UserService {
    void saveUser();
}

// 实现类
class UserServiceImpl implements UserService {
    public void saveUser() {
        System.out.println("保存用户");
    }
}

// 创建代理
UserService proxy = (UserService) Proxy.newProxyInstance(
    UserService.class.getClassLoader(),
    new Class[]{UserService.class},
    (proxyObj, method, args) -> {
        System.out.println("前置处理");
        Object result = method.invoke(new UserServiceImpl(), args);
        System.out.println("后置处理");
        return result;
    }
);

proxy.saveUser();

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

特点

  • 需要引入第三方库(cglib)
  • 可以代理普通类,不要求有接口
  • 通过继承目标类并重写方法实现代理
  • 生成速度比JDK代理稍慢,但执行效率高

使用场景

  • 当要代理的类没有实现接口时
  • Spring AOP当目标类没有接口时自动使用CGLIB

示例代码

java 复制代码
// 普通类(没有接口)
class ProductService {
    public void addProduct() {
        System.out.println("添加产品");
    }
}

// 创建代理
Enhancer enhancer = new Enhancer();
enhancer.setSuperclass(ProductService.class);
enhancer.setCallback((MethodInterceptor) (obj, method, args, proxy) -> {
    System.out.println("前置处理");
    Object result = proxy.invokeSuper(obj, args);
    System.out.println("后置处理");
    return result;
});

ProductService proxy = (ProductService) enhancer.create();
proxy.addProduct();

两种方式的对比

特性 JDK动态代理 CGLIB动态代理
实现方式 基于接口 基于继承
是否需要接口 必须 不需要
性能 生成快,调用稍慢 生成慢,调用快
限制 只能代理接口方法 不能代理final类/方法
依赖 Java内置 需要第三方库

如何选择?

  1. 如果目标对象有接口,优先用JDK动态代理(Spring默认策略)
  2. 如果目标对象没有接口,只能用CGLIB
  3. 对性能要求极高时,可以考虑CGLIB
  4. 需要代理final方法时,只能用JDK动态代理

现代框架如Spring会根据情况自动选择最合适的代理方式。

相关推荐
遇乐的果园16 分钟前
前端学习笔记-vue加载渲染优化
前端·笔记·学习
遇乐的果园2 小时前
前端学习笔记-vue状态管理优化
前端·笔记·学习
莫逸风2 小时前
【AgentScope 2.0】 0. 学习指南
java·llm·agent·agentscope
从零开始的代码生活_2 小时前
C++ 继承详解:访问控制、对象模型、菱形继承与设计取舍
开发语言·c++·后端·学习·算法
C^h2 小时前
python函数学习
人工智能·python·机器学习
Fanta丶2 小时前
4.Python set()集合、dict(字典、映射)、 数据容器的通用功能
python
决战灬2 小时前
langgraph之interrupt(理论篇)
人工智能·python·agent
可乐奶茶sky2 小时前
AI Agent 学习
人工智能·学习
z123456789863 小时前
2026最新两款AI编程工具深度对比实测
java·数据库·ai编程
兜客互动3 小时前
2026年AI关键词拓展挖掘软件,高效助力内容创作精准获流
人工智能·python