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