Java基礎---Proxy 代理

定義:

     JDK1.3增加的屬性,利用代理可以在運行時創建一個實現了一組給定接口的新類。這種功能只能在編譯時無法確定需要實現那個接口時纔有必要使用。

1.什麼是動態代理?

答:動態代理可以提供對另一個對象的訪問,同時隱藏實際對象的具體事實。代理一般會實現它所表示的實際對象的接口。代理可以訪問實際對象,但是延遲實現實際對象的部分功能,實際對象實現系統的實際功能,代理對象對客戶隱藏了實際對象。客戶不知道它是與代理打交道還是與實際對象打交道。
2.爲什麼使用動態代理?

答:因爲動態代理可以對請求進行任何處理

3.使用它有哪些好處?

答:因爲動態代理可以對請求進行任何處理
4.哪些地方需要動態代理?

答:不允許直接訪問某些類;對訪問要做特殊處理等


package Proxy;
/** 
 * @author 作者 E-mail: 
 * @version 創建時間:2015年7月18日 下午3:27:41 
 * 類說明 
 */
public interface HelloWorld {
    public void sayHelloWorld();
}

package Proxy;
/** 
 * @author 作者 E-mail: 
 * @version 創建時間:2015年7月18日 下午3:28:23 
 * 類說明 
 */
public class HelloWorldImpl implements HelloWorld{
   public void sayHelloWorld() {
       System.out.println("HelloWorld!");
   }
}

package Proxy;
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
/**
* 實現在方法調用前後向控制檯輸出兩句字符串
*
*/
public class HelloWorldHandler implements InvocationHandler{
   //要代理的原始對象
    private Object obj;
   
   public HelloWorldHandler(Object obj) {
       super();
       this.obj = obj;
   }
   /**
    * 在代理實例上處理方法調用並返回結果
    * 
    * @param proxy 代理類
    * @param method 被代理的方法
    * @param args 該方法的參數數組
    */
   public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
       Object result = null;
       //調用之前
        doBefore();
       //調用原始對象的方法
       result=method.invoke(obj, args);
       //調用之後
       doAfter();
       return result;
   }
   
   private void doBefore(){
       System.out.println("before method invoke");
   }
   
   private void doAfter(){
       System.out.println("after method invoke");
   }
   
}

package Proxy;
/** 
 * @author 作者 E-mail: 
 * @version 創建時間:2015年7月18日 下午3:31:08 
 * 類說明 
 */
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Proxy;
public class HelloWorldTest {
    public static void main(String[] args) {
        HelloWorld helloWorld=new HelloWorldImpl();
        InvocationHandler handler=new HelloWorldHandler(helloWorld);        
        //創建動態代理對象
        HelloWorld proxy=(HelloWorld)Proxy.newProxyInstance(
                helloWorld.getClass().getClassLoader(), 
                helloWorld.getClass().getInterfaces(), 
                handler);
        proxy.sayHelloWorld();
    }
}


















發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章