动态代理有哪些实现方式?

简介: 动态代理是一种在运行时创建代理对象的技术,它可以在不修改目标对象的情况下,通过代理对象来增强目标对象的功能。在Java中,有两种主要的动态代理实现方式:JDK动态代理和CGLIB动态代理。
  1. JDK动态代理:
    JDK动态代理是基于接口的代理,它要求目标对象实现一个接口。JDK动态代理使用Java的反射机制来创建代理对象。下面是JDK动态代理的实现步骤:
    (1) 定义一个接口:首先需要定义一个接口,该接口是目标对象和代理对象都要实现的。
    (2) 实现InvocationHandler接口:创建一个实现InvocationHandler接口的类,该类负责实现代理逻辑。
    (3) 使用Proxy类创建代理对象:通过Proxy类的静态方法newProxyInstance()创建代理对象,该方法需要传入一个类加载器、一个接口数组和一个InvocationHandler对象。
    (4) 调用代理对象的方法:通过代理对象调用方法时,实际上会调用InvocationHandler的invoke()方法,代理逻辑就在该方法中实现。

JDK动态代理的优点是它是Java官方提供的标准动态代理实现方式,使用简单,无需引入第三方库。但它的缺点是只能代理实现了接口的类,无法代理没有实现接口的类。

  1. CGLIB动态代理:
    CGLIB动态代理是基于类的代理,它可以代理没有实现接口的类。CGLIB动态代理使用字节码生成技术来创建代理对象。下面是CGLIB动态代理的实现步骤:
    (1) 导入CGLIB库:首先需要导入CGLIB库的依赖。
    (2) 创建Enhancer对象:创建Enhancer对象,并设置目标类作为其父类。
    (3) 设置回调函数:通过调用setCallback()方法,设置MethodInterceptor接口的实现类作为回调函数。
    (4) 创建代理对象:通过调用create()方法,创建代理对象。
    (5) 调用代理对象的方法:通过代理对象调用方法时,实际上会调用MethodInterceptor的intercept()方法,代理逻辑就在该方法中实现。

CGLIB动态代理的优点是它可以代理没有实现接口的类,使用灵活。但它的缺点是需要引入CGLIB库,增加了项目的依赖。

选择使用哪种动态代理方式应根据具体需求和场景来决定。如果目标对象已经实现了接口,推荐使用JDK动态代理;如果目标对象没有实现接口,或者需要对目标对象的类进行代理,推荐使用CGLIB动态代理。

目录
相关文章
|
2月前
|
存储 Java API
动态代理实现的两种方式
【10月更文挑战第10天】
31 2
|
2月前
|
Java
【编程进阶知识】静态代理、JDK动态代理及Cglib动态代理各自存在的缺点及代码示例
本文介绍了三种Java代理模式:静态代理、JDK动态代理和Cglib动态代理。静态代理针对特定接口或对象,需手动编码实现;JDK动态代理通过反射机制实现,适用于所有接口;Cglib动态代理则基于字节码技术,无需接口支持,但需引入外部库。每种方法各有优缺点,选择时应根据具体需求考虑。
22 1
|
4月前
|
设计模式 Java 中间件
静态代理和动态代理的区别以及实现过程
这篇文章通过示例代码讲解了静态代理和动态代理在Java中的使用方式和区别,重点介绍了动态代理的实现原理及其在Spring框架中的应用。
静态代理和动态代理的区别以及实现过程
|
7月前
|
Java API 开发者
Java代理模式——静态代理与动态代理
Java代理模式——静态代理与动态代理
61 1
|
Java Maven
JDK动态代理和CGLIB动态代理的区别及实例
JDK动态代理和CGLIB动态代理的区别及实例
212 0
|
Java 索引 Spring
静态代理?动态代理?JDK动态代理和CGLIB包实现动态代理的区别
什么是静态代理?什么是动态代理?JDK动态代理和CGLIB包实现动态代理的区别
124 1
静态代理?动态代理?JDK动态代理和CGLIB包实现动态代理的区别
|
Java 编译器 数据库连接
cglib动态代理 | 如何生成代理类、代理类内容解析
cglib动态代理 | 如何生成代理类、代理类内容解析
|
设计模式 缓存 SpringCloudAlibaba
浅析动态代理原理与实现
代理是一种软件设计模式,目的地希望能做到代码重用。具体上讲,代理这种设计模式是通过不直接访问被代理对象的方式,而访问被代理对象的方法。这个就好比 商户---->明星经纪人(代理)---->明星这种模式。我们可以不通过直接与明星对话的情况下,而通过明星经纪人(代理)与其产生间接对话
143 0
浅析动态代理原理与实现
|
缓存 Java 测试技术
动态代理:JDK动态代理源码学习
动态代理:JDK动态代理源码学习
64 1
|
设计模式 Java 程序员
静态代理和动态代理区别(是否有实现类)
静态代理和动态代理区别(是否有实现类)
374 0
静态代理和动态代理区别(是否有实现类)