基于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执行效率更高。
总结
以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。
相关文章
详解Java数据库连接JDBC基础知识(操作数据库:增删改查)
这篇文章主要介绍了详解Java数据库连接JDBC基础知识(操作数据库:增删改查),本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下2021-01-01RestFul风格 — 使用@PathVariable传递参数报错404的解决
这篇文章主要介绍了RestFul风格 — 使用@PathVariable传递参数报错404的解决,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教2021-10-10
最新评论