摘要:主要用到反射機(jī)制,和這些類(lèi)。動(dòng)態(tài)調(diào)用的方法其中,為類(lèi)的對(duì)象,為要被調(diào)用的方法名得到對(duì)象得到對(duì)象中名為的不帶參數(shù)的方法。
public void function(String str) { //根據(jù) str的值 調(diào)用相應(yīng)的方法 } public void test() { //code }
如str的值為test,就調(diào)用test方法。主要用到j(luò)ava反射機(jī)制,Class和Method這些類(lèi)。
動(dòng)態(tài)調(diào)用的方法:a.getClass().getMethod(str, new Class[]{}).invoke(a, new Object[]{})
其中,a為類(lèi)的對(duì)象,str為要被調(diào)用的方法名
a.getClass()得到a.class對(duì)象
getMethod(str, new Class[]{})得到a對(duì)象中名為str的不帶參數(shù)的方法。如果str方法帶參數(shù)如str(String s, int i),就要這樣寫(xiě)getMethod(str, new Class[]{String.class,int.class})
invoke(a,new Object[]{})調(diào)用方法,第一個(gè)參數(shù)是要調(diào)用這個(gè)方法的對(duì)象,如果方法是static的,這個(gè)參數(shù)可以為null。如果調(diào)用有參數(shù)的方法str(String s, int i),應(yīng)該這樣寫(xiě)invoke(a,new Object[]{"jimmy", 1})
下面是代碼,幫助理解
public class MovingInvokeTest { private static MovingInvokeTest movingInvokeTest = new MovingInvokeTest(); // 創(chuàng)建MovingInvokeTest對(duì)象 /* * 根據(jù)str字符串調(diào)用方法,變量i只是為了判斷,調(diào)用有幾個(gè)參數(shù)的方法 */ public void do_test(String str, int i) throws Exception { if (i == 0) { // 調(diào)用沒(méi)有參數(shù)的方法 movingInvokeTest.getClass().getMethod(str, new Class[] {}).invoke(movingInvokeTest, new Object[] {}); } else if (i == 1) { // 調(diào)用有一個(gè)參數(shù)的方法,參數(shù)為String類(lèi)型的s movingInvokeTest.getClass().getMethod(str, new Class[] { String.class }).invoke(movingInvokeTest, new Object[] { "s" }); } else if (i == 2) { // 調(diào)用有兩個(gè)參數(shù)的方法 參數(shù)分別為String類(lèi)型的qw和int型的1 movingInvokeTest.getClass().getMethod(str, new Class[] { String.class, int.class }).invoke(movingInvokeTest, new Object[] { "qw", 1 }); } } public void speak() { System.out.println("調(diào)用的沒(méi)有參數(shù)的方法"); } public void speak(String s) { System.out.println("調(diào)用有一個(gè)參數(shù)的方法,參數(shù)為:" + s); } public void speak(String s, int i) { System.out.println("調(diào)用有兩個(gè)參數(shù)的方法,參數(shù)為,參數(shù)為:" + s + "和" + i); } public static void main(String[] args) throws Exception { movingInvokeTest.do_test("speak", 1); } }
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/64122.html
摘要:這種語(yǔ)法,在中被稱(chēng)為動(dòng)態(tài)代理。在動(dòng)態(tài)代理機(jī)制中,這個(gè)角色只能是接口。動(dòng)態(tài)代理就是實(shí)現(xiàn)的技術(shù)之一。 所謂動(dòng)態(tài)代理,指的是語(yǔ)言提供的一種語(yǔ)法,能夠?qū)?duì)對(duì)象中不同方法的調(diào)用重定向到一個(gè)統(tǒng)一的處理函數(shù)中來(lái)。python重寫(xiě)__getattr__函數(shù)能夠做到這一點(diǎn),就連世界上最好的語(yǔ)言也提供稱(chēng)為魔術(shù)方法的__call。這種語(yǔ)法除了能更好的實(shí)現(xiàn)動(dòng)態(tài)代理外,還是RPC框架實(shí)現(xiàn)原理的一部分。 動(dòng)態(tài)代理...
摘要:要明白,動(dòng)態(tài)代理類(lèi)的存在意義是為了攔截方法并修改邏輯而動(dòng)態(tài)代理的局限性之一就是只能攔截接口所聲明的方法。因?yàn)閯?dòng)態(tài)代理類(lèi)是繼承自業(yè)務(wù)類(lèi),所以該類(lèi)和方法不能聲明成無(wú)法繼承或重寫(xiě)。者最終都是生成了一個(gè)新的動(dòng)態(tài)代理類(lèi)對(duì)象。 動(dòng)態(tài)代理 1、先談靜態(tài)代理 對(duì)于靜態(tài)代理,我們已經(jīng)很熟悉了。我們擁有一個(gè)抽象類(lèi),真實(shí)類(lèi)繼承自抽象類(lèi)并重寫(xiě)其業(yè)務(wù)方法,代理類(lèi)持有真實(shí)類(lèi)的對(duì)象實(shí)例,在重寫(xiě)業(yè)務(wù)方法中通過(guò)調(diào)用真實(shí)...
摘要:靜態(tài)方法生成動(dòng)態(tài)代理類(lèi)同樣需要通過(guò)類(lèi)裝載器來(lái)進(jìn)行裝載才能使用,它與普通類(lèi)的唯一區(qū)別就是其字節(jié)碼是由在運(yùn)行時(shí)動(dòng)態(tài)生成的而非預(yù)存在于任何一個(gè)文件中。 代理:設(shè)計(jì)模式 代理是一種常用的設(shè)計(jì)模式,其目的就是為其他對(duì)象提供一個(gè)代理以控制對(duì)某個(gè)對(duì)象的訪問(wèn)。代理類(lèi)負(fù)責(zé)為委托類(lèi)預(yù)處理消息,過(guò)濾消息并轉(zhuǎn)發(fā)消息,以及進(jìn)行消息被委托類(lèi)執(zhí)行后的后續(xù)處理。showImg(https://segmentfault...
摘要:代理模式代理模式通俗一點(diǎn)的解釋就是在操作一個(gè)對(duì)象和對(duì)象中的方法時(shí),不是直接操作這個(gè)對(duì)象,還是通過(guò)一個(gè)代理對(duì)象來(lái)操作這個(gè)實(shí)際的目標(biāo)對(duì)象。 代理模式: 代理模式通俗一點(diǎn)的解釋就是在操作一個(gè)對(duì)象和對(duì)象中的方法時(shí),不是直接操作這個(gè)對(duì)象,還是通過(guò)一個(gè)代理對(duì)象來(lái)操作這個(gè)實(shí)際的目標(biāo)對(duì)象。應(yīng)用場(chǎng)景一般是需要在執(zhí)行某個(gè)已經(jīng)寫(xiě)好的方法前后再添加一段邏輯,比如執(zhí)行方法前打印日志,或者在執(zhí)行方法之前和之后打時(shí)...
摘要:動(dòng)態(tài)地代理,可以猜測(cè)一下它的含義,在運(yùn)行時(shí)動(dòng)態(tài)地對(duì)某些東西代理,代理它做了其他事情。所以動(dòng)態(tài)代理的內(nèi)容重點(diǎn)就是這個(gè)。所以下一篇我們來(lái)細(xì)致了解下的到底是怎么使用動(dòng)態(tài)代理的。 之前講了《零基礎(chǔ)帶你看Spring源碼——IOC控制反轉(zhuǎn)》,本來(lái)打算下一篇講講Srping的AOP的,但是其中會(huì)涉及到Java的動(dòng)態(tài)代理,所以先單獨(dú)一篇來(lái)了解下Java的動(dòng)態(tài)代理到底是什么,Java是怎么實(shí)現(xiàn)它的。 ...
摘要:的動(dòng)態(tài)性反射機(jī)制動(dòng)態(tài)編譯動(dòng)態(tài)執(zhí)行代碼動(dòng)態(tài)字節(jié)碼操作動(dòng)態(tài)語(yǔ)言程序運(yùn)行時(shí)可以改變程序得結(jié)構(gòu)或變量類(lèi)型典型語(yǔ)言等如下代碼不是動(dòng)態(tài)語(yǔ)言但有一定的動(dòng)態(tài)性我們可以利用反射機(jī)制字節(jié)碼操作獲得類(lèi)似動(dòng)態(tài)語(yǔ)言的特性的動(dòng)態(tài)性讓編程的時(shí)候更加靈活反射機(jī)制反射機(jī)制指 1.Java的動(dòng)態(tài)性 反射機(jī)制 動(dòng)態(tài)編譯 動(dòng)態(tài)執(zhí)行JavaScript代碼 動(dòng)態(tài)字節(jié)碼操作 2.動(dòng)態(tài)語(yǔ)言 程序運(yùn)行時(shí),可以改變程序得結(jié)構(gòu)或變量...
閱讀 2627·2021-11-12 10:36
閱讀 2267·2021-08-23 09:47
閱讀 1689·2019-08-30 15:44
閱讀 1411·2019-08-30 14:10
閱讀 2249·2019-08-29 16:52
閱讀 2347·2019-08-29 16:40
閱讀 1595·2019-08-29 16:17
閱讀 2415·2019-08-26 13:21