基于jdk动态代理和cglib动态代理实现及区别说明 - 网站

基于jdk动态代理和cglib动态代理实现及区别说明

分类:Java · 发布时间:2023-11-26 19:06 · 阅读:3488

这篇文章主要介绍了基于jdk动态代理和cglib动态代理实现及区别说明,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教

jdk动态代理和cglib动态代理实现及区别

代理模式是一种设计模式,提供了对目标对象额外的访问方式,即通过代理对象访问目标对象,这样可以在不修改原目标对象的前提下,提供额外的功能操作,扩展目标对象的功能。

代理模式又分为:

  • 静态代理
  • jdk动态代理
  • cglib动态代理
  • 由于静态代理会产生过多的代理类,一旦接口增加方法,目标对象与代理对象都要进行修改,不易维护。
  • 而动态代理是动态地在内存中构建代理对象,从而实现对目标对象的代理功能,接口增加方法时代理对象不受影响 。

下面我们讲讲jdk动态代理和cglib动态代理实现及区别

jdk动态代理实现

@Test public void test(){     IPerson target = new ManPerson();     IPerson proxy = (IPerson)Proxy.newProxyInstance(         target.getClass().getClassLoader(),          target.getClass().getInterfaces(),          new PersonInvocationHandler(target));     proxy.eat();     proxy.sleep(); } // 代理对象 class PersonInvocationHandler implements InvocationHandler{     private Object target;     public PersonInvocationHandler(Object target){         this.target = target;     }     @Override     public Object invoke(Object proxy, Method method, Object[] args) throws Throwable{         System.out.println("start");     Object result = method.invoke(target, args);     System.out.println("end");     return result;     } } // 目标对象 class ManPerson implements IPerson{     @Override     public void eat(){     System.out.println("吃饭中......");     }     @Override     public void sleep(){     System.out.println("睡觉中......");     } } // 目标对象接口 interface IPerson{     void eat();     void sleep(); }

cglib动态代理

@Test public void test(){     Person proxy = (Person)Enhancer.create(Person.class, new PersonMethodInterceptor());     proxy.eat();     proxy.sleep(); } // 代理对象 class PersonMethodInterceptor implements MethodInterceptor{     @Override     public Object intercept(Object o, Method method, Object[] objects, MethodProxy methodProxy) throws Throwable{         System.out.println("start");     Object result = methodProxy.invokeSuper(o, objects);     System.out.println("end");     return result;     } }

目标对象

public class Person{     public void eat(){     System.out.println("吃饭中......");     }     public void sleep(){     System.out.println("睡觉中......");     } }

区别

1.JDK动态代理是实现了被代理对象的接口,Cglib是继承了被代理对象。

2.JDK和Cglib都是在运行期生成字节码,JDK是直接写Class字节码,Cglib使用ASM框架写Class字节码,Cglib代理实现更复杂,生成代理类比JDK效率低。

3.JDK调用代理方法,是通过反射机制调用,Cglib是通过FastClass机制直接调用方法,Cglib执行效率更高。

总结

以上为个人经验,希望能给大家一个参考,也希望大家多多支持0133技术站。

标签:
jdk 动态代理 cglib

相关文章

Java lombok中@Accessors注解三个属性的作用

这篇文章主要介绍了Java lombok的@Accessors注解属性解析,该注解主要作用是:当属性字段在生成 getter 和 setter 方法时,做一些相关的设置,需要的朋友可以参考下

java项目实现统一打印入参出参等日志

这篇文章主要介绍了java项目实现统一打印入参出参等日志方式,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教

java如何获得redis所有的key-value

这篇文章主要介绍了java如何获得redis所有的key-value,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教

mybatis中的动态sql问题

这篇文章主要介绍了mybatis中的动态sql问题,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教

IDEA高效使用设置指南

本文主要为大家介绍了关于IDEA高效的设置指南,其中包含必备的一些插件推荐以及主题优化还有IDEA源码的阅读技巧,干货满满,有需要的朋友可以借鉴参考下

返回分类 返回首页