所謂動態代理,即通過代理類: Proxy的代理, 接口和實現類之間可以不直接發生聯繫,而可以在運行期( Runtime)實現動態關聯。I
java動態代理主要是使用java.lang.reflect
包中的兩個類。
InvocationHandler類
public Object invoke(Object obj,Method method,Object[] obs)
其中第一個參數obj指的是代理類,method是被代理的方法,obs是指被代理的方法的參數組。此方法由代理類來實現。
Proxy類
protected Proxy(InvocationHandler h)
;
static Class getProxyClass(ClassLoader loader,Class[] interfaces)
;
static Object newProxyInstance(ClassLoader loader,Class[]interfaces,InvocationHandler h)
;
動態代理其實是在運行時生成class,所以,我們必須提供一組interface,然後告訴他class已經實現了這些interface,而且在生成Proxy的時候,必須給他提供一個handler, 讓他來接管實際的工作。
代碼示例:
測試主類:
package proxy;
public class Test {
public static void main(String[] args) {
Person person = new Person();
CreateProxy createProxy = new CreateProxy();
Subject o = (Subject)createProxy.create(person);
o.shopping();//invoke
}
}
/**
運行結果:
搭建平臺.....
商品選品
付款,買到一大堆零食
完成交易!
*/
Subject 類
package proxy;
public interface Subject {
public void shopping();
}
Person 類
package proxy;
public class Person implements Subject {
@Override
public void shopping() {
System.out.println("付款,買到一大堆零食");
}
}
CreateProxy類:
package proxy;
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;
//用於動態生成代理對象
public class CreateProxy implements InvocationHandler {
private Object target;//相當於Person對象
public Object create(Object target){
this.target=target;
//創建代理對象,參數爲類加載器,對象所在類的接口
Object proxy = Proxy.newProxyInstance(target.getClass().getClassLoader(), target.getClass().getInterfaces(), this);
return proxy;
}
//代理對象要執行的方法
//proxy:代理對象
//method:被代理要執行的方法(即shopping)
//args:被代理對象的參數
@Override
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
System.out.println("搭建平臺.....");
System.out.println("商品選品");
//反射獲取方法
method.invoke(target,args);
System.out.println("完成交易!");
return null;
}
}