zoukankan      html  css  js  c++  java
  • Java基础之何为动态代理?

      何为动态署理?
      在程序运转期,创立目标目标的署理目标,对目标目标中的办法进行功用性增强的一种技术;它便是JVM中,目标办法的阻拦器
      writelessdomore!!
      回顾OOP(面向目标编程)
      三大特征:封装、承继和多态比如说,有Dog类、Cat类、Horse类,它们都有eat办法,run办法,依照OOP的编程思维,那么咱们能够抽象出父类Animal,在父类中放置相同的特点或者办法,这样来防止多子类中重复的代码。一切皆目标,很牛逼了,其实它有缺点!
      OOP是纵向抽取和承继体系,OOP许多场合都能够处理咱们的问题【代码重复问题】,但是有一些场合,也有它处理不了的需求被处理的很多的代码重复问题。
      1.1什么是动态署理?
      ==动态署理便是,在程序运转期,创立目标目标的署理目标,并对目标目标中的办法进行功用性增强的一种技术==。在生成署理目标的过程中,目标目标不变,署理目标中的办法是目标目标办法的增强办法。能够理解为运转期间,目标中办法的动态阻拦,在阻拦办法的前后履行功用操作。
      署理类在程序运转期间,创立的署理目标称之为动态署理目标。这种情况下,创立的署理目标,并不是事先在Java代码中界说好的。而是在运转期间,依据咱们在动态署理目标中的“指示”,动态生成的。也便是说,你想获取哪个目标的署理,动态署理就会为你动态的生成这个目标的署理目标。动态署理能够对被署理目标的办法进行功用增强。有了动态署理的技术,那么就能够在不修正办法源码的情况下,增强被署理目标的办法的功用,在办法履行前后做任何你想做的工作。
      创立署理目标的两个办法:
      //JDK动态署理
      Proxy.newProxyInstance(三个参数);
      //CGLib动态署理
      Enhancer.create(两个参数);
      正常类创立目标的过程:
      动态署理创立署理目标的过程:
      1.2两种常用的动态署理办法
      根据接口的动态署理提供者:JDK运用JDK官方的Proxy类创立署理目标留意:署理的目标目标有必要完成接口根据类的动态署理提供者:第三方CGLib运用CGLib的Enhancer类创立署理目标留意:如果报asmxxxx反常,需求导入asm.jar包publicclassLogProxy{
      /**
      *生成目标的署理目标,对被署理目标进行一切办法日志增强
      *参数:原始目标
      *返回值:被署理的目标
      *JDK动态署理
      *根据接口的动态署理
      *被署理类有必要完成接口
      *JDK提供的
      */
      publicstaticObjectgetObject(finalObjectobj){
      /**
      *创立目标的署理目标
      *参数一:类加载器
      *参数二:目标的接口
      *参数三:调用处理器,署理目标中的办法被调用,都会在履行办法。对一切被署理目标的办法进行阻拦
      */
      ObjectproxyInstance=Proxy.newProxyInstance(obj.getClass().getClassLoader()
      ,obj.getClass().getInterfaces(),newInvocationHandler(){
      publicObjectinvoke(Objectproxy,Methodmethod,Object[]args)throwsThrowable{
      //办法履行前
      longstartTime=System.currentTimeMillis();
      Objectresult=method.invoke(obj,args);//履行办法的调用
      //办法履行后
      longendTime=System.currentTimeMillis();
      SimpleDateFormatsdf=newSimpleDateFormat();
      System.out.printf(String.format("%s办法履行结束时间:%%s;办法履行耗时:%%d%%n"
      ,method.getName()),sdf.format(endTime),endTime-startTime);
      returnresult;
      }
      });
      returnproxyInstance;
      }
      /**
      *运用CGLib创立动态署理目标
      *第三方提供的的创立署理目标的办法CGLib
      *被署理目标不能用final修饰
      *运用的是Enhancer类创立署理目标
      */
      publicstaticObjectgetObjectByCGLib(finalObjectobj){
      /**
      *运用CGLib的Enhancer创立署理目标
      *参数一:目标的字节码文件
      *参数二:办法的阻拦器
      */
      ObjectproxyObj=Enhancer.create(obj.getClass(),newMethodInterceptor(){
      publicObjectintercept(Objecto,Methodmethod,Object[]objects,MethodProxymethodProxy)throwsThrowable{
      //办法履行前
      longstartTime=System.currentTimeMillis();
      ObjectinvokeObject=method.invoke(obj,objects);//履行办法的调用
      //办法履行后
      longendTime=System.currentTimeMillis();
      SimpleDateFormatsdf=newSimpleDateFormat();
      System.out.printf(String.format("%s办法履行结束时间:%%s;办法履行耗时:%%d%%n"
      ,method.getName()),sdf.format(endTime),endTime-startTime);
      returninvokeObject;
      }
      });
      returnproxyObj;
      }
      }
      .

  • 相关阅读:
    Hibernate读书笔记Hibernate的关联映射之11关联映射
    Hibernate读书笔记Hibernate的关联映射之NN关联映射 .
    Hibernate读书笔记Hibernate的关联映射之N1关联映射
    Hibernate读书笔记继承映射
    String类型转换的三种方法分析
    使用using关键字对连接进行简化
    Hibernate读书笔记继承映射
    关于ORACLE的ora12505报错以及连接问题的解决及相关资料
    10天学会Web标准建站
    Oracle中大对象(lob)处理方法
  • 原文地址:https://www.cnblogs.com/hite/p/13278710.html
Copyright © 2011-2022 走看看