电脑知识|欧美黑人一区二区三区|软件|欧美黑人一级爽快片淫片高清|系统|欧美黑人狂野猛交老妇|数据库|服务器|编程开发|网络运营|知识问答|技术教程文章 - 好吧啦网

您的位置:首頁技術(shù)文章
文章詳情頁

詳解Java JDK動態(tài)代理

瀏覽:12日期:2022-08-26 18:05:14

今天來看看Java的另一種代理方式——JDK動態(tài)代理

我們之前所介紹的代理方式叫靜態(tài)代理,也就是靜態(tài)的生成代理對象,而動態(tài)代理則是在運行時創(chuàng)建代理對象。動態(tài)代理有更強大的攔截請求功能,因為可以獲得類的運行時信息,可以根據(jù)運行時信息來獲得更為強大的執(zhí)(騷)行(操)力(作)。

我們還是以上一個例子為例,這里的IStars接口和Stars類都不需要修改,只需要修改代理類。

創(chuàng)建JDK動態(tài)代理需要先實現(xiàn)InvocationHandler接口,并重寫其中的invoke方法,具體步驟如下:

1. 創(chuàng)建一個類實現(xiàn)InvocationHandler接口。

2. 給Proxy類提供委托類的ClassLoader和Interfaces來創(chuàng)建動態(tài)代理類。

3. 利用反射機制得到動態(tài)代理類的構(gòu)造函數(shù)。

4. 利用動態(tài)代理類的構(gòu)造函數(shù)創(chuàng)建動態(tài)代理類對象。

我們用動態(tài)代理來改造一下之前的類:

接口和委托類不需要修改:

public interface IStars { void sing(); void dance();}

public class Stars implements IStars{ private String name; public Stars(String name) { this.name = name; } public String getName() { return name; } public void setName(String name) { this.name = name; } public void sing(){ System.out.println(getName() + ' 唱了一首歌.'); } public void dance(){ System.out.println(getName() + ' 跳了一支舞.'); }}

這是使用動態(tài)代理后的代理類:

public class StarsNewProxy implements InvocationHandler { //代理類持有委托類的對象引用 private Object object; //保存sing和dance的次數(shù) private int num; public StarsNewProxy(Object object){ this.object = object; } @Override public Object invoke(Object proxy, Method method, Object[] args) throws Throwable { if (!runBefore(method)){ return null; }; //利用反射機制將請求分派給委托類處理,Method的invoke返回Object對象作為方法執(zhí)行結(jié)果 Object result = method.invoke(object,args); runAfter(method); return result; } private boolean runBefore(Method method){ System.out.println('我是代理,攔截到請求'); if (method.getName().equals('dance')){ System.out.println('抱歉,明星腳受傷了,不能跳舞表演了。'); return false; } return true; } private void runAfter(Method method){ System.out.println('我是代理,請求處理完畢'); }}

新建一個工廠類來返回代理實例:

public class StarsNewProxyFactory { //構(gòu)建工廠類,客戶類調(diào)用此方法獲得代理對象 //對于客戶類而言,代理類對象和委托類對象是一樣的,不需要知道具體返回的類型 public static IStars getInstance(String name){ IStars stars = new Stars(name); InvocationHandler handler = new StarsNewProxy(stars); IStars proxy = null; proxy = (IStars) Proxy.newProxyInstance( stars.getClass().getClassLoader(), stars.getClass().getInterfaces(), handler ); return proxy; }}

改寫一下測試類:

public class Test { public static void main(String[] args){// testA(); testB(); } /** * 靜態(tài)代理 */ private static void testA(){ //創(chuàng)建目標(biāo)對象 IStars stars = new Stars('Frank'); //代理對象,把目標(biāo)傳給代理對象,建立關(guān)系 IStars starsProxy = new StarsProxy(stars); for (int i = 0;i < 5; i++){ starsProxy.sing(); } } /** * JDK動態(tài)代理 */ private static void testB(){ IStars proxy = StarsNewProxyFactory.getInstance('Frank'); proxy.dance(); proxy.sing(); }}

輸出如下:

我是代理,攔截到請求抱歉,明星腳受傷了,不能跳舞表演了。我是代理,攔截到請求Frank 唱了一首歌.我是代理,請求處理完畢

使用動態(tài)代理時實現(xiàn)了InvocationHandler接口并重寫了invoke方法,invoke方法的三個參數(shù):

Object invoke(Object proxy, Method method, Object[] args) throws Throwableproxy:被代理的對象method:被代理對象的某個方法的Method對象args:被代理對象的某個方法接受的參數(shù)

Proxy的newProxyInstance方法詳情如下:

public static Object newProxyInstance(ClassLoader loader, Class<?>[] interfaces, InvocationHandler h) throws IllegalArgumentExceptionloader:一個ClassLoader對象,定義了由哪個ClassLoader對象來對生成的代理對象進行加載interfaces:一個Interface對象的數(shù)組,表示的是我將要給我需要代理的對象提供一組什么接口,如果我提供了一組接口給它,那么這個代理對象就宣稱實現(xiàn)了該接口(多態(tài)),這樣我就能調(diào)用這組接口中的方法了h:一個InvocationHandler對象,表示的是當(dāng)我這個動態(tài)代理對象在調(diào)用方法的時候,會關(guān)聯(lián)到哪一個InvocationHandler對象上

可以看到,這里的動態(tài)代理跟靜態(tài)代理一樣,在代理類內(nèi)部保存了一個委托類的實例,實際上都是調(diào)用原來的委托實例來進行需要的操作,代理類相當(dāng)于給委托類加上一個外殼,把委托類置于代理類的內(nèi)部,從而可以控制客戶類對委托類的訪問,就像上例中,代理類攔截了客戶類對Stars類的dance方法的訪問,并且輸出了補充信息。

動態(tài)代理跟靜態(tài)代理最大的不同便是生成代理類的時期不同,靜態(tài)代理是在編譯期,而動態(tài)代理則是在運行時根據(jù)委托類信息動態(tài)生成。

其次,動態(tài)代理實現(xiàn)的是InvocationHandler接口,而靜態(tài)代理則是直接實現(xiàn)公共接口。當(dāng)然動態(tài)代理也是需要實現(xiàn)相同的接口的,只是將接口信息放在了getInstance內(nèi)部,相當(dāng)于代理類跟委托類之間的約定,“這幾個方法幫我代理一下吧”。

最后,動態(tài)代理可以獲得更多的運行時信息,使用起來也會更加靈活。

至此,JDK動態(tài)代理講解完畢,歡迎大家繼續(xù)關(guān)注!

以上就是詳解Java JDK動態(tài)代理的詳細內(nèi)容,更多關(guān)于Java JDK動態(tài)代理的資料請關(guān)注好吧啦網(wǎng)其它相關(guān)文章!

標(biāo)簽: Java
相關(guān)文章:
主站蜘蛛池模板: 健身器材-健身器材厂家专卖-上海七诚健身器材有限公司 | 楼承板-开口楼承板-闭口楼承板-无锡海逵 | 尚为传动-专业高精密蜗轮蜗杆,双导程蜗轮蜗杆,蜗轮蜗杆减速机,蜗杆减速机生产厂家 | 济南电缆桥架|山东桥架-济南航丰实业有限公司 | 杭州翻译公司_驾照翻译_专业人工翻译-杭州以琳翻译有限公司官网 组织研磨机-高通量组织研磨仪-实验室多样品组织研磨机-东方天净 | 管家婆-管家婆软件-管家婆辉煌-管家婆进销存-管家婆工贸ERP | 温州在线网| 光伏支架成型设备-光伏钢边框设备-光伏设备厂家 | 【孔氏陶粒】建筑回填陶粒-南京/合肥/武汉/郑州/重庆/成都/杭州陶粒厂家 | 干法制粒机_智能干法制粒机_张家港市开创机械制造有限公司 | 广州冷却塔维修厂家_冷却塔修理_凉水塔风机电机填料抢修-广东康明节能空调有限公司 | 高效节能电机_伺服主轴电机_铜转子电机_交流感应伺服电机_图片_型号_江苏智马科技有限公司 | 联系我们老街华纳娱乐公司官网19989979996(客服) | 清水混凝土修复_混凝土色差修复剂_混凝土色差调整剂_清水混凝土色差修复_河南天工 | 北京森语科技有限公司-模型制作专家-展览展示-沙盘模型设计制作-多媒体模型软硬件开发-三维地理信息交互沙盘 | 江苏密集柜_电动_手动_移动_盛隆柜业江苏档案密集柜厂家 | 环保袋,无纺布袋,无纺布打孔袋,保温袋,环保袋定制,环保袋厂家,环雅包装-十七年环保袋定制厂家 | 硫酸亚铁-聚合硫酸铁-除氟除磷剂-复合碳源-污水处理药剂厂家—长隆科技 | 手机存放柜,超市储物柜,电子储物柜,自动寄存柜,行李寄存柜,自动存包柜,条码存包柜-上海天琪实业有限公司 | 金刚网,金刚网窗纱,不锈钢网,金刚网厂家- 河北萨邦丝网制品有限公司 | 铝合金风口-玻璃钢轴流风机-玻璃钢屋顶风机-德州东润空调设备有限公司 | 高尔夫球杆_高尔夫果岭_高尔夫用品-深圳市新高品体育用品有限公司 | 正压送风机-多叶送风口-板式排烟口-德州志诺通风设备 | 吸音板,隔音板,吸音材料,吸音板价格,声学材料 - 佛山诺声吸音板厂家 | 袋式过滤器,自清洗过滤器,保安过滤器,篮式过滤器,气体过滤器,全自动过滤器,反冲洗过滤器,管道过滤器,无锡驰业环保科技有限公司 | 西点培训学校_法式西点培训班_西点师培训_西点蛋糕培训-广州烘趣西点烘焙培训学院 | 安全,主动,被动,柔性,山体滑坡,sns,钢丝绳,边坡,防护网,护栏网,围栏,栏杆,栅栏,厂家 - 护栏网防护网生产厂家 | 沈阳液压泵_沈阳液压阀_沈阳液压站-沈阳海德太科液压设备有限公司 | 【连江县榕彩涂料有限公司】官方网站 | 联系我们老街华纳娱乐公司官网19989979996(客服) | 在线浊度仪_悬浮物污泥浓度计_超声波泥位计_污泥界面仪_泥水界面仪-无锡蓝拓仪表科技有限公司 | 加中寰球移民官网-美国移民公司,移民机构,移民中介,移民咨询,投资移民 | 防火门-专业生产甲级不锈钢钢质防火门厂家资质齐全-广东恒磊安防设备有限公司 | 旋转气浴恒温振荡器-往复式水浴恒温振荡器-金怡百科 | 沧州友城管业有限公司-内外涂塑钢管-大口径螺旋钢管-涂塑螺旋管-保温钢管生产厂家 | 智慧食堂_食堂管理系统_食堂订餐_食堂消费系统—客易捷 | 暴风影音| 废旧物资回收公司_广州废旧设备回收_报废设备物资回收-益美工厂设备回收公司 | 活性氧化铝球|氧化铝干燥剂|分子筛干燥剂|氢氧化铝粉-淄博同心材料有限公司 | 无尘烘箱_洁净烤箱_真空无氧烤箱_半导体烤箱_电子防潮柜-深圳市怡和兴机电 | 线材成型机,线材折弯机,线材成型机厂家,贝朗自动化设备有限公司1 |