網(wǎng)站 建設(shè)制作菜鳥教程建網(wǎng)站的流程
jdk動態(tài)代理:基于反射動態(tài)生成代理對象
pwp動態(tài)代理的步驟比較復(fù)雜,無需特別深入的理解,在jdk中固定的步驟,只需要知道這些步驟即可,不必鉆牛角尖
動態(tài)代理涉及到的三個反射包類
- InvocationHandler
- Method
- Proxy
1. InvocationHandler接口(調(diào)用處理器)
就一個invoke()方法,表示代理對象要執(zhí)行的功能代碼。你的代理類要完成的功能就寫在invoke方法中
參數(shù):
Object proxy:jdk創(chuàng)建的代理對象,無需賦值。
Method method:目標(biāo)類中的方法,jdk提供的method對象。
Object[ ] args:目標(biāo)類中方法的參數(shù),jdk提供的。
2、Method類
表示方法的,確切的說 就是目標(biāo)類中的方法。
作用:通過Method可以執(zhí)行某個目標(biāo)類中的方法,Method.invoke();
Method.invoke(目標(biāo)對象,方法的參數(shù));
Object res = method.invoke(target, “劉龍”);//這里不需要指定方法的名稱,jdk會幫我們尋找
說明:Method.invoke();就是幫我們指定目標(biāo)方法的,代替目標(biāo)方法的執(zhí)行,等同于靜態(tài)代理中的使用目標(biāo)類調(diào)用方法。
//創(chuàng)建接口
public interface sell {void sellcart(String name);
}
//創(chuàng)建接口實(shí)現(xiàn)類
public class railway implements sell {@Overridepublic void sellcart(String name) {System.out.println(name+"在火車站出售了火車票--------");}
}
public class TestApp {public static void main(String[] args) throws NoSuchMethodException, InvocationTargetException, IllegalAccessException {//使用反射機(jī)制執(zhí)行sellcart方法,核心Method(類中的方法)sell target = new railway();//獲取sellcart名稱對應(yīng)的Method類對象Method method = sell.class.getMethod("sellcart", String.class);//通過Method可以執(zhí)行 sellcart方法調(diào)用/*** invoke是Method類中的一個方法。表示執(zhí)行方法的調(diào)用* 參數(shù):* 1、Object 表示對象的,要執(zhí)行這個對象的方法* 2、Object...args、方法執(zhí)行時的參數(shù)值返回值:Object:方法執(zhí)行后的返回值*///表達(dá)的意思就是,執(zhí)行target對象的sellcart方法,參數(shù)是劉龍Object res = method.invoke(target, "劉龍");//執(zhí)行代理方法}
}
3、 Proxy類
動態(tài)代理的核心對象,創(chuàng)建代理對象。之前創(chuàng)建對象都是new類的構(gòu)造方法(),現(xiàn)在我們是使用Proxy類的方法,代替new的使用。
方法:靜態(tài)方法newProxyInstance()
作用是:創(chuàng)建代理對象,等同于靜態(tài)代理中的TaoBao tao = new TaoBao();
參數(shù):
1.ClassLoader loader類加載器:
負(fù)責(zé)向內(nèi)存中加載對象的。使用反射獲取對象的CladdLoader。例如類A a.getClass().getClassLoader(),目標(biāo)對象的類加載器
2.Class<?>[] interfaces:接口,
目標(biāo)對象實(shí)現(xiàn)的接口,也是反射獲取的
3.InvocationHandler h:我們自己寫的,代理類要完成的功能。
返回值:就是代理對象
實(shí)現(xiàn)動態(tài)代理的步驟
1.創(chuàng)建接口,定義目標(biāo)類要完成的功能
2.創(chuàng)建目標(biāo)類實(shí)現(xiàn)接口
3.創(chuàng)建InvocationHandler 接口的實(shí)現(xiàn)類,在invoke方法中完成代理類的功能
(1)調(diào)用目標(biāo)方法
(2)增強(qiáng)功能
4.使用Proxy類的靜態(tài)方法,創(chuàng)建代理對象。并把返回值轉(zhuǎn)為接口類型