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