程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> JAVA編程 >> 關於JAVA >> spring入門(13) JDK動態代理

spring入門(13) JDK動態代理

編輯:關於JAVA

首先我們來了解一下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>
  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved