溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

Java中怎么利用反射生成JDK代理

發(fā)布時間:2021-06-25 16:41:22 來源:億速云 閱讀:128 作者:Leah 欄目:編程語言

本篇文章為大家展示了Java中怎么利用反射生成JDK代理,內(nèi)容簡明扼要并且容易理解,絕對能使你眼前一亮,通過這篇文章的詳細介紹希望你能有所收獲。

一 點睛

1 動態(tài)代理

java.lang.reflect包下提供了一個Proxy類和一個InvocationHandler接口,通過使用這個類和接口可以生成JDK動態(tài)代理類或動態(tài)代理對象。

Proxy 提供用于創(chuàng)建動態(tài)代理類和代理對象的靜態(tài)方法,它也是所有動態(tài)代理類的父類。如果我們在程序中為一個或多個接口動態(tài)地生成實現(xiàn)類,就可以使用Proxy來創(chuàng)建的動態(tài)代理類;如果需要為一個或多個接口動態(tài)地創(chuàng)建實例,也可以使用Proxy來創(chuàng)建動態(tài)代理實例。

2 Proxy

Proxy提供了如下兩個方法來創(chuàng)建動態(tài)代理類和動態(tài)代理實例:

static Class<?> getProxyClass(ClassLoader loader, Class<?>... interfaces):創(chuàng)建一個動態(tài)代理類所對應的Class對象,該代理類將實現(xiàn)interfaces所指定的多個接口。第一個ClassLoader指定生成動態(tài)代理類的類加載器。

static Object newProxyInstance(ClassLoader loader,Class<?>[] interfaces, InvocationHandler h):直接創(chuàng)建一個動態(tài)代理對象,該代理對象的實現(xiàn)類實現(xiàn)了interfaces指定的系列接口,執(zhí)行代理對象的每個方法時都會被替換執(zhí)行InvocationHandler對象的invoke方法。

二 實戰(zhàn)

1 代碼

import java.lang.reflect.*;interface Person{  void walk();  void sayHello(String name);}class MyInvokationHandler implements InvocationHandler{  /*  執(zhí)行動態(tài)代理對象的所有方法時,都會被替換成執(zhí)行如下的invoke方法  其中:  proxy:代表動態(tài)代理對象  method:代表正在執(zhí)行的方法  args:代表調(diào)用目標方法時傳入的實參。  */  public Object invoke(Object proxy, Method method, Object[] args)  {    System.out.println("----正在執(zhí)行的方法:" + method);    if (args != null)    {      System.out.println("下面是執(zhí)行該方法時傳入的實參為:");      for (Object val : args)      {        System.out.println(val);      }    }    else    {      System.out.println("調(diào)用該方法沒有實參!");    }    return null;  }}public class ProxyTest{  public static void main(String[] args)    throws Exception  {    // 創(chuàng)建一個InvocationHandler對象    InvocationHandler handler = new MyInvokationHandler();    // 使用指定的InvocationHandler來生成一個動態(tài)代理對象    Person p = (Person)Proxy.newProxyInstance(Person.class.getClassLoader()      , new Class[]{Person.class}, handler);    // 調(diào)用動態(tài)代理對象的walk()和sayHello()方法    p.walk();    p.sayHello("孫悟空");  }}

2 運行

E:\Java\瘋狂java講義\codes\18\18.5>java ProxyTest----正在執(zhí)行的方法:public abstract void Person.walk()調(diào)用該方法沒有實參!----正在執(zhí)行的方法:public abstract void Person.sayHello(java.lang.String)

上述內(nèi)容就是Java中怎么利用反射生成JDK代理,你們學到知識或技能了嗎?如果還想學到更多技能或者豐富自己的知識儲備,歡迎關注億速云行業(yè)資訊頻道。

向AI問一下細節(jié)

免責聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權請聯(lián)系站長郵箱:is@yisu.com進行舉報,并提供相關證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權內(nèi)容。

AI