天天看點

【Java進階-Java動态代理與AOP】03 建立動态類的執行個體對象及調用其方法【Java進階-Java動态代理與AOP】03 建立動态類的執行個體對象及調用其方法

【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多線程與并發庫進階應用教程