每日一题:动态代理是基于什么原理❓

什么是动态代理❓

动态代理是一种在运行时动态生成代理对象,并在代理对象上进行方法调用的编程技术。它主要用于在不修改原有代码基础上,增加或改变某些功能的执行流程。动态代理广泛应用于 AOP(面向切面编程)、RPC(远程过程调用)、事务管理等领域。在 Java 中,主要有两种动态代理的实现方式:

JDK 动态代理和 CGLIB 动态代理。

JDK 动态代理🚩

JDK 动态代理是基于接口的代理技术。它使用 java.lang.reflect.Proxy 类和 java.lang.reflect.InvocationHandler 接口来创建代理对象。当你调用代理对象的任何方法时,调用会被转发到 InvocationHandler 的 invoke 方法。你可以在这个 invoke 方法中定义拦截逻辑,比如前置处理、后置处理等。

为了使用 JDK 动态代理,你的类必须实现一个或多个接口。JDK 动态代理的局限性在于,它只能代理接口方法,如果你有一个类并希望代理其非接口方法,则不能使用 JDK 动态代理。
优点以及缺点🏘️:

  • 优点:原生支持,无需引入额外依赖。
  • 缺点:只能代理接口,如果一个类没有实现任何接口,则不能使用 JDK 动态代理。

操作步骤🚀:
1)定义一个接口及其实现类。
2)创建一个实现了 InvocationHandler 接口的类,在该类的 invoke 方法中定义代理逻辑。
3)通过 Proxy.newProxyInstance 方法动态创建接口的代理对象。

CGLIB 动态代理🚩

CGLIB(Code Generation Library)是一个强大的、高性能、高质量的 Code 生成库,它可以在运行时扩展 Java 类和实现 Java 接口。不同于 JDK 动态代理,CGLIB 不需要接口,它是通过继承方式实现代理的。

CGLIB 底层通过使用一个小而快的字节码处理框架 ASM ,来转换字节码并生成新的类。不仅可以代理普通类的方法,还能代理那些没有接口的类的方法。

优点以及缺点🏘️:

  • 优点:无需接口实现。在大量调用的场景下,其生成的代理对象在调用时性能比 JDK 动态代理高
  • 缺点:对 final 方法无效,需添加额外的依赖。

操作步骤🚀:

1)创建一个需要被代理的类。
2)创建一个继承 MethodInterceptor 的代理类,在 intercept 方法中定义代理逻辑。
3)使用 Enhancer 类创建被代理类的子类,并设置回调。

使用场景🔍

  • 如果目标对象实现了接口,推荐使用 JDK 动态代理。
  • 如果目标对象没有实现接口,或者有特定需求需要通过继承方式代理,则使用 CGLIB。
  • 5
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值