【Java進階-Java動态代理與AOP】03 建立動态類的執行個體對象及調用其方法
建立動态類的執行個體對象
由上一篇文章中分析,動态代理類隻有一個構造方法
com.sun.proxy.$Proxy4(java.lang.reflect.InvocationHandler)
是以,我們需要了解InvocationHandler這個接口,其中隻有一個invoke方法,簽名如下:
public Object invoke(Object proxy, Method method, Object[] args)
throws Throwable;
proxy 表示代理對象
method 表示動态類傳遞過來的方法
args 表示動态類傳遞過來的參數
更多詳細的内容留在以後的文章中說明。
下面,我們建立動态類的執行個體,代碼如下:
/**
* 通過代理建立對象
* @param clazzProxy1
* @return
*/
private static Collection newInstanceByProxy(Class clazzProxy1) throws Exception {
Constructor constructor = clazzProxy1.getConstructor(InvocationHandler.class);
Collection coll = (Collection)constructor.newInstance(new InvocationHandler(){
@Override
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
return null;
}
});
return coll;
}
調用動态類執行個體的方法
調用動态類執行個體的方法以及分析過程如下:
/**
* 建立代理類的執行個體
* 代理類的執行個體方法調用的限制
*/
@Test
public void newInstanceByProxyTest()
throws NoSuchMethodException, InstantiationException, IllegalAccessException, InvocationTargetException {
Class clazzProxy1 = Proxy.getProxyClass(Collection.class.getClassLoader(), Collection.class);
Constructor constructor = clazzProxy1.getConstructor(InvocationHandler.class);
Collection coll = (Collection)constructor.newInstance(new InvocationHandler(){
@Override
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
return null;
}
});
System.out.println(coll); // null,但并非是空指針,而是傳回值是 null 字元串
System.out.println(coll.toString());
//int size = coll.size();
//調用有傳回值的方法會出現異常,因為傳回值是 invoke的傳回結果 null,null無法轉換為int或其他類型,
//但是可以轉換為 void 類型,即無傳回值
coll.clear();
}
InvocationHandler中的invoke方法的傳回值,就是動态類的方法的傳回值。
如果InvocationHandler中的invoke的傳回值類型不能強轉為動态類中方法的傳回值的類型,将會抛出異常。
參考:
Java多線程與并發庫進階應用教程