Proxy 提供用於建立動態代理類和執行個體的靜態方法。簡潔方法:
Foo f = (Foo) Proxy.newProxyInstance(Foo.class.getClassLoader(),
new Class[] { Foo.class },
handler);
InvocationHandler 是代理執行個體的調用處理常式 實現的介面。
每個代碼執行個體都具有一個關聯的調用處理常式。對代理執行個體調用方法時,將對方法調用進行編碼並將其指派到它的調用處理常式的 invoke 方法。
對java的動態代理機制有點陌生了,整理一下以前的代碼。 package invocation;
/** */ /**
* 定義一個介面,兩個方法
* @author Jessica
*
*/
public interface Subject ... {
public void print(String str);
public void print2();
}
package invocation;
/** */ /**
* 定義一個類,實現Subject介面
* @author Jessica
*
*/
public class RealObject implements Subject ... {
public RealObject() ...{
super();
}
public void print(String str)...{
System.out.println("run into print");
}
public void print2()...{
System.out.println("run into print2");
}
}
package invocation;
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;
/** */ /**
* 實現InvocationHandler介面,為RealObject對象提供代理(代理類)
* @author Jessica
*
*/
public class CallBack implements InvocationHandler ... {
private Object obj;
public CallBack(Object obj) ...{
this.obj = obj;
}
/** *//**
* 給對象建立動態代理
* @param obj 需要建立代理的對象
* @return 返回動態代理對象
*/
public static Object factory(Object obj) ...{
Class cls = obj.getClass();
return Proxy.newProxyInstance(cls.getClassLoader(),
cls.getInterfaces(), new CallBack(obj));
}
/** *//**
* 在代理執行個體上處理方法調用並返回結果。
* 在與方法關聯的代理執行個體上調用方法時,將在調用處理常式上調用此方法。
* @proxy - 在其上調用方法的代理執行個體
* @method - 對應於在代理執行個體上調用的介面方法的 Method 執行個體
* @args - 包含傳入代理執行個體上方法調用的參數值的對象數組
* @Throwable - 從代理執行個體上的方法調用拋出的異常
*/