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