java的动态代理机制详解,JAVA动态代理-简书
爪哇岛开发工具包动态代理:利用反射机制生成一个实现代理接口的匿名类,在调用具体方法前调用InvokeHandler来处理。
字节码生成动态代理:利用ASM(开源的爪哇字节码编辑库,操作字节码)开源包,将代理对象类的班级文件加载进来,通过修改其字节码生成子类来处理。
区别:JDK代理只能对实现接口的类生成代理;字节码生成是针对类实现代理,对指定的类生成一个子类,并覆盖其中的方法,这种通过继承类的实现方式,不能代理最后的修饰的类。
强制使用字节码生成
!- proxy-target-class=false 默认使用爪哇岛开发工具包动态代理-AOP : AspectJ-auto proxy proxy-target-class= true /AOP-config proxy-target-class= true 具体代码示例:
/** * 目标接口类*/公共接口用户管理器{ public void addUser(字符串id,字符串密码);公共无效去光器(字符串id);}/** * 接口实现类*/公共类UserManagerImpl实现用户管理器{ @ Override public void addUser(String id,String password){ system。出去。println(调用了UserManagerImpl.addUser()方法!);} @ Override public void delUser(String id){ system。出去。println(调用了UserManagerImpl.delUser()方法!);} }/** * JDK动态代理类*/公共类JDKProxy实现InvocationHandler { //需要代理的目标对象私有对象目标对象公共对象新代理(对象目标对象){//将目标对象传入进行代理这个。目标对象=目标对象;//返回代理对象返回代理。newproxyinstance(目标对象。getclass().getClassLoader()、targetObject.getClass().getInterfaces(),this);} //调用方法@覆盖公共对象调用(对象代理、方法方法、对象[]参数)抛出可投掷的{ //进行逻辑处理的函数检查pope DOM();Object ret=null//调用引起方法ret=method.invoke(targetObject,args);返回ret } private void check popedom(){//模拟检查权限System.out.println(检查权限:checkPopedom()!);} } /** * CGlib动态代理类*/公共类CGLibProxy实现MethodInterceptor { //CGlib需要代理的目标对象私有对象目标对象公共对象createProxyObject(Object obj){ this。目标对象=obj增强剂增强剂=新增强子();增强剂。设置超类(obj。getclass());增强剂。设置回调(this);对象代理obj=增强器。create();返回proxyObj} @覆盖公共对象拦截(对象代理,方法方法,对象[]参数,方法代理方法代理)抛出可抛出的{ Object obj=null//过滤方法if (addUser ).等于(方法。getname()){//检查权限检查pope DOM();} obj=方法。invoke(目标对象,参数);返回private void check pope DOM(){ system。出去。println(检查权限:checkPopedom()!);}}/** * 测试类*/public类代理测试{ public static void main(String[]args){ user manager user manager=(user manager)new CGLibProxy().createProxyObject(new UserManagerImpl());系统。出去。println( CGLibProxy:);userManager.addUser(tom , root );系统。出去。println( JDK代理:);JDK代理JDK代理=新JDK代理();用户管理器userManagerJDK=(用户管理器)JDK代理。new proxy(new UserManagerImpl());userManagerJDK.addUser(tom , root );}}//运行结果CGLibProxy:检查权限checkPopedom()!调用了UserManagerImpl.addUser()方法!JDKProxy:检查权限checkPopedom()!掉用了UserManagerImpl.addUser()方法!
总结:
JDK代理使用反射机制实现aop动态代理,CGLIB代理使用字节码处理框架asm通过修改字节码生成子类。所以jdk的动态代理方法创建代理对象效率高,执行效率低,而cglib创建效率低,执行效率高。JDK的动态代理机制是一种委托机制,特别是动态实现接口类。在动态生成的实现类中,它委托hanlder调用原来的实现类方法,而CGLIB使用继承机制。具体来说,代理类和代理类是继承的,所以代理类可以分配给代理类。如果代理类有接口,代理类也可以分配给接口。这就是这篇关于Java实例解释动态代理的文章。有关Java动态代理的更多信息,请搜索以前关于流行IT的文章或继续浏览下面的相关文章。我希望你将来能支持流行它!
郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。