首先我們來了解一下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>