资讯专栏INFORMATION COLUMN

JAVA动态代理和CGLIB实现模式

187J3X1 / 1263人阅读

摘要:在代理实例上调用方法时,方法调用将被转发到的方法动态代理实现的代理模式必须有一个的接口方法代理类实现类的实现方式是一个基于的字节码生成库,它允许我们在运行时对字节码进行修改和动态生成。

动态代理是使用反射和字节码的技术,在运行期创建指定接口或类的子类(动态代理)以及其实例对象的技术,通过这个技术可以无侵入性的为代码进行增强

Proxy:Proxy是所有动态代理的父类,它提供了一个静态方法来创建动态代理的class对象和实例;
InvocationHandler:每个动态代理实例都有一个关联的InvocationHandler。 在代理实例上调用方法时,方法调用将被转发到InvocationHandler的invoke方法;

1.java 动态代理实现

</>复制代码

  1. //java的代理模式必须有一个interface的接口方法
  2. public interface ItemService {
  3. void sayHello();
  4. }
  5. public class ItemServiceImpl implements ItemService {
  6. @Override
  7. public void sayHello() {
  8. System.out.println("hello world~");
  9. }
  10. }
  11. //代理类
  12. public class MyInvocationHandler implements InvocationHandler {
  13. private Object realObject;
  14. public void setRealObject(Object realObject) {
  15. this.realObject = realObject;
  16. }
  17. public Object getRealObject() {
  18. return realObject;
  19. }
  20. public MyInvocationHandler(Object realObject){
  21. super();
  22. this.realObject=realObject;
  23. }
  24. @Override
  25. public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
  26. System.out.println("before running ~~");
  27. Object ret=method.invoke(realObject,args);
  28. System.out.println("after running ~~~");
  29. return ret;
  30. }
  31. }
  32. // 实现类
  33. public class main {
  34. public static void main(String[] args) {
  35. ItemService itemService=new ItemServiceImpl();
  36. MyInvocationHandler handler=new MyInvocationHandler(itemService);
  37. ItemService proxy= (ItemService) Proxy.newProxyInstance(itemService.getClass().getClassLoader(),itemService.getClass().getInterfaces(),handler);
  38. proxy.sayHello();
  39. }
  40. }

2.CGLIB的实现方式

CGLIB(Code Generation Library)是一个基于ASM的字节码生成库,它允许我们在运行时对字节码进行修改和动态生成。CGLIB通过继承方式实现代理;
Enhancer:来指定要代理的目标对象、实际处理代理逻辑的对象,最终通过调用create()方法得到代理对象,对这个对象所有非final方法的调用都会转发给MethodInterceptor;
MethodInterceptor:动态代理对象的方法调用都会转发到intercept方法进行增强;

</>复制代码

  1. //1.需要引入
  2. cglib
  3. cglib
  4. 3.2.6
  5. //2.方法
  6. public class ItemServiceImpl {
  7. void sayHello(String name) {
  8. System.out.println("hello world~"+name);
  9. }
  10. }
  11. //3.cglib代理实现类
  12. public class MyInterceptor implements MethodInterceptor {
  13. private Object realObject;
  14. public void setRealObject(Object realObject) {
  15. this.realObject = realObject;
  16. }
  17. public Object getRealObject() {
  18. return realObject;
  19. }
  20. public MyInterceptor(Object realObject){
  21. this.realObject=realObject;
  22. }
  23. @Override
  24. public Object intercept(Object o, Method method, Object[] objects, MethodProxy methodProxy) throws Throwable {
  25. System.out.println("before running ~~");
  26. System.out.println(method);
  27. System.out.println(Arrays.toString(objects));
  28. Object ret=methodProxy.invoke(realObject,objects);
  29. System.out.println("after running ~~");
  30. return ret;
  31. }
  32. }
  33. //4.实现类
  34. public class main {
  35. public static void main(String[] args) {
  36. ItemServiceImpl itemService=new ItemServiceImpl();
  37. Enhancer enhancer=new Enhancer();
  38. enhancer.setSuperclass(ItemServiceImpl.class);
  39. enhancer.setCallback(new MyInterceptor(itemService));
  40. ItemServiceImpl imp= (ItemServiceImpl) enhancer.create();
  41. imp.sayHello("张三");
  42. }
  43. }

总结:
JDK原生动态代理是Java原生支持的,不需要任何外部依赖,但是它只能基于接口进行代理;
CGLIB通过继承的方式进行代理,无论目标对象有没有实现接口都可以代理,但是无法处理final的情况

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/73743.html

相关文章

  • Java三种代理模式:静态代理动态代理cglib代理

    摘要:动态代理又被称为代理或接口代理。静态代理在编译时产生字节码文件,可以直接使用,效率高。代理无需实现接口,通过生成类字节码实现代理,比反射稍快,不存在性能问题,但会继承目标对象,需要重写方法,所以目标对象不能为类。 一、代理模式介绍 代理模式是一种设计模式,提供了对目标对象额外的访问方式,即通过代理对象访问目标对象,这样可以在不修改原目标对象的前提下,提供额外的功能操作,扩展目标对象的功...

    Kaede 评论0 收藏0
  • Java设计模式代理模式

    摘要:设计模式之代理模式今天学到的动态代理实现,对代理这个概念很模糊,看了一篇文章发现这是一种设计模式,于是学习记录一下。简介代理模式是一种对象结构型的模式,主要为其他对象提供一种代理以控制对这个对象的访问。下面依次讲解着三种代理。 设计模式之代理模式 今天学到Spring的动态代理实现AOP,对代理这个概念很模糊,看了一篇文章发现这是一种设计模式,于是学习记录一下。 简介 代理模式是一种对...

    ZHAO_ 评论0 收藏0
  • Java代理设计模式(Proxy)的四种具体实现:静态代理动态代理

    摘要:除了和外,我们还有最后一招我直接把一个代理类的源代码用字符串拼出来,然后基于这个字符串调用的编译期,动态的创建一个新的文件,然后动态编译这个文件,这样也能得到一个新的代理类。 面试问题:Java里的代理设计模式(Proxy Design Pattern)一共有几种实现方式?这个题目很像孔乙己问茴香豆的茴字有哪几种写法? showImg(https://segmentfault.com/...

    gclove 评论0 收藏0
  • Java动态代理 jdkcglib实现比较

    摘要:与静态代理对比,动态代理是在动态生成代理类,由代理类完成对具体方法的封装,实现的功能。本文将分析中两种动态代理的实现方式,和,比较它们的异同。那如何动态编译呢你可以使用,这是一个封装了的库,帮助你方便地实现动态编译源代码。 发现Java面试很喜欢问Spring AOP怎么实现的之类的问题,所以写一篇文章来整理一下。关于AOP和代理模式的概念这里并不做赘述,而是直奔主题,即AOP的实现方...

    h9911 评论0 收藏0
  • Java设计模式综合运用(动态代理+Spring AOP)

    摘要:动态代理的核心是接口和类。以上结果说明它生成的代理类为,说明是代理。测试前提实现接口测试类使用接口方式注入代理方式必须以接口方式注入测试配置为,运行结果如下实际校验逻辑。。。。 本文也同步发布至简书,地址:https://www.jianshu.com/p/f70... AOP设计模式通常运用在日志,校验等业务场景,本文将简单介绍基于Spring的AOP代理模式的运用。 1. 代理模...

    王晗 评论0 收藏0

发表评论

0条评论

187J3X1

|高级讲师

TA的文章

阅读更多
最新活动
阅读需要支付1元查看
<