JAVA SE 基礎複習-Class與反射(2)

Java動態代理一——動態類Proxy的使用

更詳細的參考:http://blog.csdn.net/lovelion/article/details/8116704html

1.什麼是動態代理?java

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

答:由於動態代理能夠對請求進行任何處理post

3.使用它有哪些好處?測試

答:由於動態代理能夠對請求進行任何處理
4.哪些地方須要動態代理?this

答:不容許直接訪問某些類;對訪問要作特殊處理等url

 

目前Java開發包中包含了對動態代理的支持,可是其實現只支持對接口的的實現。 其實現主要經過java.lang.reflect.Proxy類和java.lang.reflect.InvocationHandler接口。 spa

Proxy類主要用來獲取動態代理對象,InvocationHandler接口用來約束調用者實現.net

如下爲模擬案例,經過動態代理實如今方法調用先後向控制檯輸出兩句字符串代理

目錄結構

定義一個HelloWorld接口

package com.ljq.test;

 /**
 * 定義一個HelloWorld接口
 * 
 * @author jiqinlin
 *
 */
 public interface HelloWorld {
    public void sayHelloWorld();
}

 

類HelloWorldImpl是HelloWorld接口的實現

package com.ljq.test;

 /**
 * 類HelloWorldImpl是HelloWorld接口的實現
 * 
 * @author jiqinlin
 *
 */
 public class HelloWorldImpl implements HelloWorld{

    public void sayHelloWorld() {
        System.out.println("HelloWorld!");
    }

}

 

HelloWorldHandler是 InvocationHandler接口實現

package com.ljq.test;

 import java.lang.reflect.InvocationHandler;
 import java.lang.reflect.Method;

 /**
 * 實如今方法調用先後向控制檯輸出兩句字符串
 * 
 * @author jiqinlin
 *
 */
 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 com.ljq.test;

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();
    }
}

 

運行結果爲:

相關文章
相關標籤/搜索