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