Java動態代理的解析

    時間:2024-09-28 05:12:53 JAVA認證 我要投稿
    • 相關推薦

    關于Java動態代理的解析

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

      眾所周知,JDK的動態代理模式必須實現接口。

      以下面的源碼為例:

      接口一:

      public interface ActionInterface {

      void doSelf(String str);

      String getType();

      }

      接口二:

      public interface InterruupIntf {

      void interrup();

      }

      實現類:

      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("業務實現類: " + str + " !");

      }

      public void interrup() {

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

      }

      }

      動態代理需要反射,

      * 必須要實現InvocationHandler接口

      * 能夠對所有的方法進行代理

      public class MyInvocationHandler implements InvocationHandler {

      private Object obj;

      /**

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

      * @param obj

      */

      public MyInvocationHandler(Object obj) {

      this.obj = obj;

      }

      /**

      * 動態代理需要反射

      *

      */

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

      throws Throwable {

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

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

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

      return returnObject;

      }

      /**

      * 測試函數

      * 動態代理對所有的代理類都進行了攔截

      * @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 {

      //實現業務邏輯的類

      MyselfImpl muSelf = new MyselfImpl();

      //JDK創建的動態邏輯類,調用上面的構造函數注入

      MyInvocationHandler myInvocation = new MyInvocationHandler(muSelf);

      /*

      Class proxyClass = Proxy.getProxyClass(

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

      //建業務邏輯類的動態代理類

      Object proxy = proxyClass.getConstructor(

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

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

      //建業務邏輯類的動態代理類

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

      //業務類自己調用運行代理對象

      ActionInterface testIntf = (ActionInterface) proxy;

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

      testIntf.getType();

      InterruupIntf intIntf = (InterruupIntf) proxy;

      intIntf.interrup();

      }

      }

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

      +++++++++++調用業務方法之前做其他事情

      業務實現類: 我要做業務了! !

      +++++++++++調用業務方法之前做其他事情

      +++++++++++調用業務方法之前做其他事情

      公用部門

      +++++++++++調用業務方法之前做其他事情

      +++++++++++調用業務方法之前做其他事情

      發呆三分鐘!

      +++++++++++調用業務方法之前做其他事情

      看到結果了。

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

    【Java動態代理的解析】相關文章:

    Java動態代理實現AOP的方法07-22

    Java腳本動態用法06-11

    解析動態NAT配置09-24

    Java中的動態代碼編程06-27

    Java的內存劃分全解析08-02

    java命令行參數解析201608-12

    計算機二級JAVA考點解析10-12

    關于計算機二級JAVA考點解析07-14

    Java與Java web的區別08-10

    2017年計算機二級JAVA考點解析08-03

    91久久大香伊蕉在人线_国产综合色产在线观看_欧美亚洲人成网站在线观看_亚洲第一无码精品立川理惠

      一本大道之中文日本香蕉 | 亚洲一级AV在线播放 | 久久综合丝袜日本网首页 | 一本一本大道香蕉久在线播放 | 永久三级网站在线观看 | 亚洲国产精品第一页 |