亚洲AV日韩AⅤ综合手机在线观看,激情婷婷久久综合色,欧美色五月婷婷久久,久久国产精品99久久人人澡

  • <abbr id="uk6uq"><abbr id="uk6uq"></abbr></abbr>
  • <tbody id="uk6uq"></tbody>
  • Java動態(tài)代理的解析

    時間:2020-10-08 16:14:57 JAVA認證 我要投稿

    關于Java動態(tài)代理的解析

      動態(tài)代理類是位于Java.lang.reflect包下的Interface InvocationHandler。下面小編準備了關于Java動態(tài)代理的解析,提供給大家參考!

      眾所周知,JDK的動態(tài)代理模式必須實現(xiàn)接口。

      以下面的源碼為例:

      接口一:

      public interface ActionInterface {

      void doSelf(String str);

      String getType();

      }

      接口二:

      public interface InterruupIntf {

      void interrup();

      }

      實現(xiàn)類:

      public class MyselfImpl implements ActionInterface, InterruupIntf {

      public String getType() {

      String type = "公用部門";

      System.out.println(type);

      return type;

      }

      public void doSelf(String str) {

      System.out.println("業(yè)務實現(xiàn)類: " + str + " !");

      }

      public void interrup() {

      System.out.println("發(fā)呆三分鐘!");

      }

      }

      動態(tài)代理需要反射,

      * 必須要實現(xiàn)InvocationHandler接口

      * 能夠?qū)λ械姆椒ㄟM行代理

      public class MyInvocationHandler implements InvocationHandler {

      private Object obj;

      /**

      * 通過構造方法來設置被代理的對象

      * @param obj

      */

      public MyInvocationHandler(Object obj) {

      this.obj = obj;

      }

      /**

      * 動態(tài)代理需要反射

      *

      */

      public Object invoke(Object proxy, Method method, Object[] args)

      throws Throwable {

      System.out.println("+++++++++++調(diào)用業(yè)務方法之前做其他事情");

      Object returnObject = method.invoke(obj, args);

      System.out.println("+++++++++++調(diào)用業(yè)務方法之前做其他事情");

      return returnObject;

      }

      /**

      * 測試函數(shù)

      * 動態(tài)代理對所有的代理類都進行了攔截

      * @throws NoSuchMethodException

      * @throws InvocationTargetException

      * @throws IllegalAccessException

      * @throws InstantiationException

      * @throws SecurityException

      * @throws IllegalArgumentException

      */

      public static void main(String[] args) throws InterruptedException,

      IllegalArgumentException, SecurityException,

      InstantiationException, IllegalAccessException,

      InvocationTargetException, NoSuchMethodException {

      //實現(xiàn)業(yè)務邏輯的類

      MyselfImpl muSelf = new MyselfImpl();

      //JDK創(chuàng)建的.動態(tài)邏輯類,調(diào)用上面的構造函數(shù)注入

      MyInvocationHandler myInvocation = new MyInvocationHandler(muSelf);

      /*

      Class proxyClass = Proxy.getProxyClass(

      MyselfImpl.class.getClassLoader(), MyselfImpl.class.getInterfaces());

      //建業(yè)務邏輯類的動態(tài)代理類

      Object proxy = proxyClass.getConstructor(

      new Class[] { InvocationHandler.class }).newInstance(

      new MyInvocationHandler(new MyselfImpl())); */

      //建業(yè)務邏輯類的動態(tài)代理類

      Object proxy = Proxy.newProxyInstance(MyselfImpl.class.getClassLoader(), MyselfImpl.class.getInterfaces(), myInvocation);

      //業(yè)務類自己調(diào)用運行代理對象

      ActionInterface testIntf = (ActionInterface) proxy;

      testIntf.doSelf("我要做業(yè)務了!");

      testIntf.getType();

      InterruupIntf intIntf = (InterruupIntf) proxy;

      intIntf.interrup();

      }

      }

      運行最后一個類的MAIN函數(shù),控制臺輸出結果如下:

      +++++++++++調(diào)用業(yè)務方法之前做其他事情

      業(yè)務實現(xiàn)類: 我要做業(yè)務了! !

      +++++++++++調(diào)用業(yè)務方法之前做其他事情

      +++++++++++調(diào)用業(yè)務方法之前做其他事情

      公用部門

      +++++++++++調(diào)用業(yè)務方法之前做其他事情

      +++++++++++調(diào)用業(yè)務方法之前做其他事情

      發(fā)呆三分鐘!

      +++++++++++調(diào)用業(yè)務方法之前做其他事情

      看到結果了。

      JDK的動態(tài)代理,對MyselfImpl所有方法都進行了攔截,在調(diào)用真正的業(yè)務類方法之前之后都插入了代碼,這就是JDK的動態(tài)代理。其實SPRING的AOP思想的基本原理也是這個,但是它寫的比較負責,而且比較優(yōu)秀。

    【關于Java動態(tài)代理的解析】相關文章:

    Java動態(tài)代理實現(xiàn)AOP的方法10-25

    Java腳本動態(tài)用法10-26

    Java中的動態(tài)代碼編程06-05

    解析動態(tài)NAT配置05-19

    java語言的特性解析06-02

    解析動態(tài)NAT配置「實例」05-12

    Java的內(nèi)存劃分全解析09-01

    Java如何設置代理IP訪問網(wǎng)站12-18

    java命令行參數(shù)解析201611-11