动态代理的两种方式是什么关系,动态代理的两种方式是什么区别

  动态代理的两种方式是什么关系,动态代理的两种方式是什么区别

  写爬虫互联网协议(互联网协议)被封了怎么解决?立即使用

  本教程操作环境:windows7系统、java8版、戴尔自交第三代电脑。

  动态代理是反射的一个非常重要的应用场景。动态代理常被用于一些爪哇框架中。例如春天的达博,AOP的精力接口,就是基于爪哇动态代理实现的。

  动态代理的方式有两种:

  爪哇岛开发工具包动态代理:利用反射机制生成一个实现代理接口的匿名类,在调用具体方法前调用InvokeHandler来处理。

  字节码生成动态代理:利用ASM(开源的爪哇字节码编辑库,操作字节码)开源包,将代理对象类的班级文件加载进来,通过修改其字节码生成子类来处理。

  区别:JDK代理只能对实现接口的类生成代理;字节码生成是针对类实现代理,对指定的类生成一个子类,并覆盖其中的方法,这种通过继承类的实现方式,不能代理最后的修饰的类。

  强制使用字节码生成

  !- proxy-target-class=false 默认使用爪哇岛开发工具包动态代理-

  AOP:AspectJ-autoproxy proxy-target-class= true /

  AOP-配置代理目标类=真

  !-切面详细配置-

  /AOP-配置具体代码示例:

  /**

  * 目标接口类

  */

  公共接口用户管理器{

  公共void addUser(字符串id,字符串密码);

  公共无效去光器(字符串id);

  }/**

  * 接口实现类

  */

  公共类UserManagerImpl实现用户管理器{

  @覆盖

  公共void addUser(字符串id,字符串密码){

  System.out.println(调用了UserManagerImpl.addUser()方法!);

  }

  @覆盖

  公共空的删除器(字符串id) {

  System.out.println(调用了UserManagerImpl.delUser()方法!);

  }

  }/**

  * JDK动态代理类

  */

  公共类JDKProxy实现InvocationHandler {

  //需要代理的目标对象

  私有对象目标对象

  公共对象newProxy(Object targetObject) {

  //将目标对象传入进行代理

  这个。目标对象=目标对象;

  //返回代理对象

  返回代理。newproxyinstance(目标对象。getclass().getClassLoader()、targetObject.getClass().getInterfaces(),this);

  }

  //调用方法

  @覆盖

  公共对象调用(对象代理、方法方法、对象[]参数)抛出可投掷的

  //进行逻辑处理的函数

  检查pope DOM();

  对象ret=null

  //调用引起方法

  ret=method.invoke(targetObject,args);

  返回浸水使柔软

  }

  私有void checkPopedom() {

  //模拟检查权限

  System.out.println(检查权限:checkPopedom()!);

  }

  }/**

  * CGlib动态代理类

  */

  公共类CGLibProxy实现MethodInterceptor {

  //CGlib需要代理的目标对象

  私有对象目标对象

  公共对象createProxyObject(对象对象){

  this.targetObject=obj

  增强剂增强剂=新增强子();

  增强剂。设置超类(obj。getclass());

  增强剂。设置回调(this);

  对象代理obj=增强器。create();

  返回proxyObj

  }

  @覆盖

  公共对象截获(对象代理,方法方法,对象[]参数,方法代理方法代理)抛出可投掷的

  对象obj=null

  //过滤方法

  if (addUser ).等于(方法。getname()){

  //检查权限

  检查pope DOM();

  }

  obj=method.invoke(targetObject,args);

  返回目标文件

  }

  私有void checkPopedom() {

  System.out.println(检查权限:checkPopedom()!);

  }

  }/**

  * 测试类

  */

  公共类代理测试{

  公共静态void main(String[] args) {

  user manager user manager=(user manager)new CGLibProxy().createProxyObject(new UserManagerImpl());

  系统。出去。println( CGLibProxy:);

  userManager.addUser(tom , root );

  system . out . println( JDK proxy:);

  JDK proxy JDK proxy=new JDK proxy();

  user manager userManagerJDK=(user manager)JDK proxy . new proxy(new UserManagerImpl());

  userManagerJDK.addUser(tom , root );

  }

  }//运行结果

  CGLibProxy:

  Check permissions checkPopedom()!

  调用了UserManagerImpl.addUser()方法!

  JDKProxy:

  Check permissions checkPopedom()!

  UserManagerImpl.addUser()方法已被删除!总结:

  1.JDK代理使用反射机制实现aop,CGLIB代理使用字节码处理框架asm通过修改字节码生成子类。所以jdk的动态代理方法创建代理对象效率高,执行效率低,而cglib创建效率低,执行效率高。

  2.JDK的动态代理机制是一种委托机制。具体来说,接口类是动态实现的。在动态生成的实现类中,委托hanlder调用原实现类的方法。CGLIB使用继承机制。具体来说,代理类和代理类是继承的,所以代理类可以分配给代理类。如果代理类有接口,代理类也可以分配给接口。

  (推荐教程:java入门)以上是动态代理的两种方式的详细介绍。更多请关注我们的其他相关文章!

郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。

留言与评论(共有 条评论)
   
验证码: