首先我們來了解一下java中的代理模式,代理模式的英文叫做Proxy或Surrogate,中文都可譯為”代理“,所謂代理,就 是一個人或者一個機構代表另一個人或者另一個機構采取行動。在一些情況下,一個客戶不想或者不能夠直接引用一個對象 ,而代理對象可以在客戶端和目標對象之間起到中介的作用。
1、抽象主題角色
聲明了真實主題和代理主題 的共同接口,這樣一來在任何可以使用真實主題的地方都可以是使用代理主題
2、代理主題(Proxy)角色:
代理主題角色內部含有對真實主題的引用,從而可以在任何時候操作真實主題對象;代理主題角色提供一個與真實主題角色 相同的接口,以便可以在任何時候都可以替代真實主題控制對真實主題的引用,負責在需要的時候創建真實主題對象(和刪 除真實主題對象);代理角色通常在將客戶端調用傳遞給真實的主題之前或之後,都要執行某個操作,而不是單純地將調用 傳遞給真實主題對象。
3、真實主題角色
定義了代理角色所代表地真實對象
JDK動態代理是基於接口 的,必須實現了某一個或多個任意接口才可以被代理,並且只有這些接口中的方法會被代理.下面通過一個(男朋友要和女朋 友分手)案例講解JDK動態代理的實現.
1、創建一個接口
package www.csdn.spring.jdk.proxy; //抽象主題 角色 public interface SayGoodBye { /** * 說的內容 * @param content */ public void say(String content); }
package www.csdn.spring.jdk.proxy; //抽象主題 角色 public interface SayGoodBye { /** * 說的內容 * @param content */ public void say(String content); }
2、創建接口的實現類。
package www.csdn.spring.jdk.proxy; //這是主題角色 public class SayGoodByeImpl implements SayGoodBye { @Override public void say(String content) { System.out.println("say:" + content); } }
package www.csdn.spring.jdk.proxy; //這是主題角色 public class SayGoodByeImpl implements SayGoodBye { @Override public void say(String content) { System.out.println("say:" + content); } }
3、測試說明
package www.csdn.spring.jdk.proxy; import org.junit.Test; public class TestSay { @Test public void say(){ //創建對象 SayGoodByeImpl sayGoodByeImpl = new SayGoodByeImpl(); //調用say方法 sayGoodByeImpl.say("咱們分手吧!"); } }
package www.csdn.spring.jdk.proxy; import org.junit.Test; public class TestSay { @Test public void say(){ //創建對象 SayGoodByeImpl sayGoodByeImpl = new SayGoodByeImpl(); //調用say方法 sayGoodByeImpl.say("咱們分手吧!"); } }
分析說明:上面創建SayGoodByeImpl的實例,調用了say方法,相當於男朋友自己給女朋友說咱們分手吧.但是男 朋友不想和自己的女朋友直接說,想找一個中間人來說。那麼就要使用到了代理。下面創建這樣的代理類:
4、代理 類
package www.csdn.spring.jdk.proxy; import java.lang.reflect.InvocationHandler; import java.lang.reflect.Method; import java.lang.reflect.Proxy; /** * JDK動態代理 * @author redarmy */ public class JDKProxy implements InvocationHandler { // 代理目標對象 private Object target; // 創建目標對象的的代理對象 public Object createProxyInstance(Object target) { this.target = target;// 代理的目標對象 // 創建代理對象 // 1、定義代理類的類加載器 // 2、代理類要實現的接口列表 // 3、 指派方法調用的調用處理程序 return Proxy.newProxyInstance(target.getClass().getClassLoader(), target.getClass().getInterfaces(), this); } /** * proxy:目標對象的代理實例method:對於代理實例調用接口方法的Method實例args:方法參數 */ @Override public Object invoke(Object proxy, Method method, Object[] args) throws Throwable { // 聲明返回值 Object returnValue = null; beforeMethod(); // 執行目標方法 returnValue = method.invoke(target, args); afterMethod(); // 修改返回值 return returnValue; } public void beforeMethod(){ System.out.println("---------------------目標方法之前執行"); } public void afterMethod(){ System.out.println("---------------------目標方法之後執行"); } }
package www.csdn.spring.jdk.proxy; import java.lang.reflect.InvocationHandler; import java.lang.reflect.Method; import java.lang.reflect.Proxy; /** * JDK動態代理 * @author redarmy */ public class JDKProxy implements InvocationHandler { // 代理目標對象 private Object target; // 創建目標對象的的代理對象 public Object createProxyInstance(Object target) { this.target = target;// 代理的目標對象 // 創建代理對象 // 1、定義代理類的類加載器 // 2、代理類要實現的接口列表 // 3、 指派方法調用的調用處理程序 return Proxy.newProxyInstance(target.getClass().getClassLoader(), target.getClass().getInterfaces(), this); } /** * proxy:目標對象的代理實例method:對於代理實例調用接口方法的Method實例args:方法參數 */ @Override public Object invoke(Object proxy, Method method, Object[] args) throws Throwable { // 聲明返回值 Object returnValue = null; beforeMethod(); // 執行目標方法 returnValue = method.invoke(target, args); afterMethod(); // 修改返回值 return returnValue; } public void beforeMethod(){ System.out.println("---------------------目標方法之前執行"); } public void afterMethod(){ System.out.println("---------------------目標方法之後執行"); } }
5、測試說明
<PRE class=java name="code">package www.csdn.spring.jdk.proxy; import org.junit.Test; public class TestSay { @Test public void say(){ //真實主題角色 SayGoodByeImpl sayGoodByeImpl = new SayGoodByeImpl(); //代理角色 JDKProxy jdkProxy = new JDKProxy(); SayGoodBye sayProxy = (SayGoodBye) jdkProxy.createProxyInstance(sayGoodByeImpl); //代理說: sayProxy.say("你和他分手吧!!!"); } }</PRE> <PRE></PRE> <P></P> <PRE></PRE> <P></P>
<center class="dp-highlighter bg_java"><center class="bar"><center class="tools"><strong>[java]</strong> <a class="ViewSource" title="view plain" href="http://blog.csdn.net/redarmy_chen/article/details/8864551#">view plain</a><a class="CopyToClipboard" title="copy" href="http://blog.csdn.net/redarmy_chen/article/details/8864551#">copy</a><a class="PrintSource" title="print" href="http://blog.csdn.net/redarmy_chen/article/details/8864551#">print</a><a class="About" title="?" href="http://blog.csdn.net/redarmy_chen/article/details/8864551#">? </a></center></center><ol class="dp-j"><li class="alt"><span class="keyword">package</span> www.csdn.spring.jdk.proxy; </li><li> </li><li class="alt"><span class="keyword">import</span> org.junit.Test; </li><li> </li><li class="alt"><span class="keyword">public</span> <span class="keyword">class</span> TestSay { </li><li> </li><li class="alt"><span class="annotation">@Test</span> </li><li> </li><li class="alt"><span class="keyword">public</span> <span class="keyword">void</span> say(){ </li><li> </li><li class="alt"><span class="comment">//真實主題角色 </span> </li><li>SayGoodByeImpl sayGoodByeImpl = <span class="keyword">new</span> SayGoodByeImpl(); </li><li class="alt"> </li><li><span class="comment">//代理角色 </span> </li><li class="alt">JDKProxy jdkProxy = <span class="keyword">new</span> JDKProxy(); </li><li>SayGoodBye sayProxy = (SayGoodBye) jdkProxy.createProxyInstance(sayGoodByeImpl); </li><li class="alt"> </li><li><span class="comment">//代理說: </span> </li><li class="alt">sayProxy.say(<span class="string">"你和他分手吧!!!"</span>); </li><li> </li><li class="alt">} </li><li>} </li></ol></center><pre style="DISPLAY: none" class="java" name="code">package www.csdn.spring.jdk.proxy; import org.junit.Test; public class TestSay { @Test public void say(){ //真實主題角色 SayGoodByeImpl sayGoodByeImpl = new SayGoodByeImpl(); //代理角色 JDKProxy jdkProxy = new JDKProxy(); SayGoodBye sayProxy = (SayGoodBye) jdkProxy.createProxyInstance(sayGoodByeImpl); //代理說: sayProxy.say("你和他分手吧!!!"); } }</pre> <pre></pre> <p></p> <pre></pre> <p></p> <pre></pre>