国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 學院 > 開發(fā)設(shè)計 > 正文

jdk動態(tài)代理&spring aop

2019-11-08 18:49:32
字體:
供稿:網(wǎng)友

1>jdk 動態(tài)代理基礎(chǔ)(來源:http://www.iteye.com/topic/683613/)

/**  * 相親接口  *   * @author zhengt  * @time Jun 3, 2095 3:13:03 PM  */  public interface XiangQinInterface {      /**      * 相親方法      */      public void xiangQin();  }  /**  * 張三相親實現(xiàn)類  *   * @author zhengt  * @time Jun 3, 2095 3:14:48 PM  */  public class ZhangSanXiangQinInterfaceImpl implements XiangQinInterface {      public void xiangQin() {          System.out.PRintln("張三去相親,娶個漂亮老婆。");      }  }  import java.lang.reflect.InvocationHandler;  import java.lang.reflect.Method;    /**  * 相親可是一輩子的大事,相親前要準備一下,打扮得帥氣些。  *   * @author zhengt  * @time Jun 3, 2095 3:15:48 PM  */  public class ReadyInvocationHandler implements InvocationHandler {      //相親接口的實現(xiàn)類,也就是張三相親類      private Object zhangSan = null;        public ReadyInvocationHandler(Object realSubject) {          this.zhangSan = realSubject;      }        public Object invoke(Object proxy, Method m, Object[] args) {          Object result = null;          try {              /**              * 動態(tài)代理類$Proxy0調(diào)用xiangQin方法時會調(diào)用它自己的xiangQin方法,              * 而它自己的xiangQin方法里面調(diào)用的是super.h.invoke(this, , ),也就是父類Proxy的h的invoke方法,              * 也就是ReadyInvocationHandler類的invoke方法。              * 所以,invoke(Object proxy, Method m, Object[] args)種的proxy實際上就是動態(tài)代理類$Proxy0,              * 如果你將其強轉(zhuǎn)成XiangQinInterface然后調(diào)用它的xiangQin方法,然后它就會調(diào)用super.h.invoke(this, , ),這樣就會死循環(huán)。              */              /**              * 網(wǎng)上關(guān)于這里最多問題就是Object proxy放在這里用來做什么呢?這個我也不知道,              * 不過至少我們知道它到底是個什么東西,具體做什么用嘛就不得而知了              */              System.out.println(proxy.getClass().getSimpleName());              System.out.println("張三相親前,代理人給他打扮了打扮。");              result = m.invoke(zhangSan, args);          } catch (Exception ex) {              System.exit(1);          }          return result;      }  }  import java.lang.reflect.InvocationHandler;  import java.lang.reflect.Method;  import java.lang.reflect.Proxy;    /**  * 張三來到了婚介所(相親現(xiàn)場),開始相親。  *   * @author zhengt  * @time Jun 3, 2095 3:17:16 PM  */  public class HunJieSuo {      public static void main(String args[]) {          //先將張三相親這個相親的實現(xiàn)類實例化,也就是得到XiangQinInterface接口的一個實例對象          XiangQinInterface zhangSan = new ZhangSanXiangQinInterfaceImpl();          /**          * 得到ZhangSanXiangQinInterfaceImpl這個類的一個代理類,同時為代理類綁定了一個處理類ReadyInvocationHandler。          * 聽著很繞口,其實就是每次調(diào)用ZhangSanXiangQinInterfaceImpl這個子類的xiangQin方法時,          * 不是zhangSan這個ZhangSanXiangQinInterfaceImpl類的實例去調(diào)用,          * 而是這個ZhangSanXiangQinInterfaceImpl的代理類ReadyInvocationHandler去調(diào)用它自己的invoke方法,          * 這個invoke方法里呢可以調(diào)用zhangSan這個實例的xiangQin方法          */          /**          * 在java種怎樣實現(xiàn)動態(tài)代理呢          * 第一步,我們要有一個接口,還要有一個接口的實現(xiàn)類,而這個實現(xiàn)類呢就是我們要代理的對象,          * 所謂代理呢也就是在調(diào)用實現(xiàn)類的方法時,可以在方法執(zhí)行前后做額外的工作,這個就是代理。          * 第二步,我們要自己寫一個在要代理類的方法執(zhí)行時,能夠做額外工作的類,而這個類必須繼承InvocationHandler接口,          * 為什么要繼承它呢?因為代理類的實例在調(diào)用實現(xiàn)類的方法的時候,不會調(diào)真正的實現(xiàn)類的這個方法,          * 而是轉(zhuǎn)而調(diào)用這個類的invoke方法(繼承時必須實現(xiàn)的方法),在這個方法中你可以調(diào)用真正的實現(xiàn)類的這個方法。          * 第三步,在要用代理類的實例去調(diào)用實現(xiàn)類的方法的時候,寫出下面兩段代碼。          */          XiangQinInterface proxy = (XiangQinInterface) Proxy.newProxyInstance(                  zhangSan.getClass().getClassLoader(),                  zhangSan.getClass().getInterfaces(),                  new ReadyInvocationHandler(zhangSan));          proxy.xiangQin();          /**          * 這里要解釋下中部那段長長的代碼的意思,以及具體做了哪些工作?          * 第一,根據(jù)zhangSan.getClass().getClassLoader()這個要代理類的類加載器和          * zhangSan.getClass().getInterfaces()要代理類所實現(xiàn)的所有的接口          * 作為參數(shù)調(diào)用Proxy.getProxyClass(ClassLoader loader, Class<?>... interfaces)          * 的方法返回代理類的java.lang.Class對象,也就是得到了java動態(tài)生成的代理類$Proxy0的Class對象。          * 同時,java還讓這個動態(tài)生成的$Proxy0類實現(xiàn)了要代理類的實現(xiàn)的所有接口,并繼承了Proxy接口。          * 第二,實例化這個動態(tài)生成的$Proxy0類的一個實例,實例化代理類的構(gòu)造函數(shù)為Proxy(InvocationHandler h),          * 也就是說要實例化這個動態(tài)生成的$Proxy0類,必須給它一個InvocationHandler參數(shù),也就是我們自己實現(xiàn)的用來在代理類          * 方法執(zhí)行前后做額外工作的類ReadyInvocationHandler。          * 這段代碼Proxy.newProxyInstance(zhangSan.getClass().getClassLoader(),zhangSan.getClass().getInterfaces(),new ReadyInvocationHandler(zhangSan))          * 得到的其實是一個類名叫$Proxy0 extends Proxy implements XiangQinInterface的類。          * 第三,將這個$Proxy0類強制轉(zhuǎn)型成XiangQinInterface類型,調(diào)用xiangQin方法。          */      }  }  

2>aop實例:見附件


發(fā)表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發(fā)表
主站蜘蛛池模板: 阿拉善盟| 仲巴县| 巴南区| 于田县| 库伦旗| 双桥区| 名山县| 民权县| 台北县| 德保县| 泰宁县| 天水市| 独山县| 新营市| 安宁市| 宽甸| 阿合奇县| 裕民县| 化隆| 沐川县| 屏边| 新乡市| 哈尔滨市| 祥云县| 秦皇岛市| 兴义市| 监利县| 塔河县| 印江| 昌乐县| 紫阳县| 织金县| 崇义县| 遵义县| 江门市| 安西县| 克什克腾旗| 新巴尔虎左旗| 木兰县| 彰武县| 乌审旗|