Java動態代理--動態類proxy的使用

1.什麼是動態代理?java

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

用戶-----------------------------------實際對象測試

用戶---------動態代理(中介)--------實際對象this

2.爲何使用動態代理?spa

動態代理能夠對請求進行任何處理.net

3.使用它的好處?代理

動態代理能夠對請求進行任何處理對象

4.哪些地方須要動態代理?接口

不容許直接訪問某些類,對訪問要作特殊處理等開發

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

Proxy類主要用來獲取動態代理對象, InvocationHandler接口用來約束調用者實現
如下爲模擬案例, 經過動態代理實如今方法調用先後向控制檯輸出兩句字符串

package com.test.proxy;
/**
 * 定義一個HelloProxy接口
 * @author anlve
 *
 */
public interface HelloProxy {

    public void sayHelloProxy();
    
}

 

package com.test.proxy;
/**
 * 接口實現類HelloProxyImpl
 * @author anlve
 *
 */
public class HelloProxyImpl implements HelloProxy{

    public void sayHelloProxy() {
        System.out.println("Hello Proxy");
    }

}

package com.test.proxy;

import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
/**
 * HelloProxyHandler實現InvocationHandler
 * @author anlve
 * 實如今方法調用先後   向控制檯輸出兩句字符串
 */
public class HelloProxyHandler implements InvocationHandler {

    //要代理的原始對象
    private Object obj;
    
    public HelloProxyHandler(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 doAfter() {
        System.out.println("after method invoke");
    }

    private void doBefore() {
        System.out.println("before method invoke");
    }

}

package com.test.proxy;

import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Proxy;

/**
 * 測試類
 * @author anlve
 *
 */
public class HelloProxyTest {

    public static void main(String[] args) {
        HelloProxy helloProxy = new HelloProxyImpl();
        InvocationHandler handler = new HelloProxyHandler(helloProxy);
        //建立動態代理對象
        HelloProxy proxy = (HelloProxy) Proxy.newProxyInstance(
                helloProxy.getClass().getClassLoader(), 
                helloProxy.getClass().getInterfaces(),
                handler);
        proxy.sayHelloProxy();
    }
    
}
 

控制檯

相關文章
相關標籤/搜索