繼續,接着上兩篇部落格繼續往下講反射。
八、通過反射調用類中的方法
我們還是用我們的ClassTest 這個類做操作。
我們呢,現在能通過反射擷取到方法、能擷取到屬性。我們現在通過反射來調用一下say方法。不是以前我們通過對象去調用。而是反射。

從這裡開始看起,我們現在已經擷取到了Class類,
然後我們進行一下執行個體化,并且給兩個參數
執行個體化之後,我們指派給一個Object。
然後我們調用一下say方法。
我們發現并沒有say方法。原因這是Object類,say方法是我們定義在了包子這個内部類中的。通過Object肯定調用不到。
那我們怎麼辦呢?我們這麼來操做。
固定套路啊,記住即可。
先用object .getClass(),然後,在調用.getMethod(),這時候可以填寫參數,我們來看一下這個getMethod()方法的源碼
第一個name參數,是指的是你要調用的方法名稱,比如說我們要調用say() 這個方法,那麼我們給name傳參傳的是say即可。
第二個參數,大家可能沒有見過,這個是指的我們要調用的方法的參數個數。可能說到這裡大家有點蒙。我們直接舉例說明
假設我們現在有兩個方法,一個是方法A,需要傳入三個參數,都是int類型的,然後有個方法B,需要傳入4個參數,前三個都是String,最後一個是boolean。
A(int a, int b, int c){...}
B(String a, String b, String c, boolean d) {...}
如果這時候有人通過反射調用了getMethod,我們該怎麼傳入參數呢?
固定套路:如果反射調用A 那麼就是 xxx . getClass() . getMethod("A", Integer.class, Integer.class, Integer.class);(這裡需要傳入包裝類)
如果是反射調用B,那麼就是 xxx . getClass() . getMethod("B", String.class, String.class, String.class, Boolean.class);
(ps: Class<?>... parameterTypes 這個東西我們在部落格最下面說,還有如何給參數的問題也是放下面說)
知道了怎麼調用,就好辦了。因為我們say方法是沒有參數的,是以我們啥也不給他傳
object.getClass().getMethod("say"); 直接這樣就行
然後這個會給我們傳回一個Method,我們有了這個方法之後,我們可以使用Method這個類給我們提供的invoke方法進行調用。
這裡也得需要傳入一個參數,我們看一下源碼需要傳入什麼參數
很好,都是我認識的單詞,但是組成句子我就不知道是什麼意思了。Google翻譯一下
這也就是說,誰調用的,你放誰就好。
那很明顯,我們是Object這個東西調用的,我們就把它放進去。完整的代碼如下:
完美運作。
九、Class<?>... parameterTypes
我們來看一下這個是什麼參數。
我們看這個費勁,我們就弄個簡單的例子:
我們看一下輸出什麼
輸出了這麼個玩意,我們呢,來使用一下debug斷點來進行看一下(Debug後面我會講如何去使用,先跟我學着用一下)
滑鼠移動到箭頭位置,輕按兩下,就會出現這麼一個小點點,這樣我們就是打上斷點了
我平時運作程式都會點選類似于播放的内個按鈕,這次我們不要點這個,我們選擇旁邊和蟲子一樣的内個,點選運作。
點選switch,然後界面就會變成這樣
這樣就進入了debug模式,我們把滑鼠移動到abc上,
很明顯啊,這是一個數組,也就是說,String... abc居然是個數組。然後我們按F8。
知道了這是個數組,我們就需要些一個循環去周遊擷取值。
但是如何添加值呢?我們總不能就添加一個asdfa這麼個東西吧。其實,直接填寫即可。
這個按照理想情況可以無限添加,但是,你要是添加的太多了,擠爆記憶體了,那就GG了。
這個String... 叫做可變參數,就是随着你給的參數數量自己改變,這裡不止是可以String 還可以給别的,大家可以自己試一試。
十、如何給參數的問題
我們繼續來說主題,剛剛又跑偏了
我們先來改造一下我們的包子類。我們這次随便寫一個方法,給定參數,給定傳回值。
順便用一下剛剛學習的。我們來調用一下這個方法
因為我們要傳入的是一個數組,是以我們這麼去寫getMethod
object.getClass().getMethod("getSome", int[].class);
是的,沒有錯,就這麼搞
然後我們建立一個數組a,int[] a = {1,2,3,4,5};
最後我們調用一下使用Method的invoke方法,但是這次我們需要将參數a傳過去,怎麼傳呢?
我們直接放進去,然後傳入參數
運作一下
但是還沒有完,我們最後傳回了一個參數OK,這個怎麼擷取?
其實看method的invoke源碼你會看到,他會傳回一個Object,這個就是我們調用的方法所傳回的參數,我們用一個Object接收一下,然後輸出
感謝大家支援,記得點個關注,老司機帶你上高速。