<ruby id="bdb3f"></ruby>

    <p id="bdb3f"><cite id="bdb3f"></cite></p>

      <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
        <p id="bdb3f"><cite id="bdb3f"></cite></p>

          <pre id="bdb3f"></pre>
          <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

          <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
          <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

          <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                <ruby id="bdb3f"></ruby>

                [TOC] **動態代理有以下特點:** 1.代理對象,不需要實現接口 2.代理對象的生成,是利用JDK的API,動態的在內存中構建代理對象(需要我們指定創建代理對象/目標對象實現的接口的類型) 3.動態代理也叫做:**JDK代理,接口代理** **JDK中生成代理對象的API** 代理類所在包:java.lang.reflect.Proxy JDK實現代理只需要使用newProxyInstance方法,但是該方法需要接收三個參數,完整的寫法是: ~~~ static Object newProxyInstance(ClassLoader loader, Class<?>[] interfaces,InvocationHandler h ) ~~~ 注意該方法是在Proxy類中是靜態方法,且接收的三個參數依次為: * `ClassLoader loader,`:指定當前目標對象使用類加載器,獲取加載器的方法是固定的 * `Class<?>[] interfaces,`:目標對象實現的接口的類型,使用泛型方式確認類型 * `InvocationHandler h`:事件處理,執行目標對象的方法時,會觸發事件處理器的方法,會把當前執行目標對象的方法作為參數傳入 ### 代碼示例: 接口類IUserDao.java以及接口實現類,目標對象UserDao是一樣的,沒有做修改.在這個基礎上,增加一個代理工廠類 (ProxyFactory.java),將代理類寫在這個地方,然后在測試類(需要使用到代理的代碼)中先建立目標對象和代理對象的聯系,然后代用代理 對象的中同名方法 ### 代理工廠類: ProxyFactory.java ~~~ package com.yc.model.ProxyFactory; import java.lang.reflect.InvocationHandler; import java.lang.reflect.Method; import java.lang.reflect.Proxy; import java.security.PublicKey; /* 創建動態代理對象 動態代理不需要實現,但是要指定接口類型 */ public class ProxyFactory { private Object target; public ProxyFactory(Object target){ this.target=target; } public Object getProxyInstance(){ return Proxy.newProxyInstance(target.getClass().getClassLoader(), target.getClass().getInterfaces(), new InvocationHandler() { @Override public Object invoke(Object proxy, Method method, Object[] args) throws Throwable { System.out.println("開始事務2"); //運用反射執行目標對象方法 Object returnValue = method.invoke(target, args); System.out.println("提交事務2"); return returnValue; } }); } } ~~~ ### 測試類 ~~~ package com.yc.model; import com.yc.model.ProxyFactory.ProxyFactory; import com.yc.model.Service.IUserDao; import com.yc.model.Service.Impl.UserDao; public class Test { public static void main (String[] args){ //目標對象 IUserDao target =new UserDao(); //代理對象 IUserDao proxy = (IUserDao)new ProxyFactory(target).getProxyInstance(); //執行的是代理的方法 proxy.save(); } } ~~~ ### 結果: ![](https://img.kancloud.cn/03/9c/039c32cefce51d36c62e6649303817c9_1034x452.png)
                  <ruby id="bdb3f"></ruby>

                  <p id="bdb3f"><cite id="bdb3f"></cite></p>

                    <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
                      <p id="bdb3f"><cite id="bdb3f"></cite></p>

                        <pre id="bdb3f"></pre>
                        <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

                        <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
                        <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

                        <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                              <ruby id="bdb3f"></ruby>

                              哎呀哎呀视频在线观看