天天看點

Java學習裡程-----Java基礎_24 Java 反射機制(下)八、通過反射調用類中的方法九、Class<?>... parameterTypes十、如何給參數的問題

繼續,接着上兩篇部落格繼續往下講反射。

八、通過反射調用類中的方法

我們還是用我們的ClassTest 這個類做操作。

我們呢,現在能通過反射擷取到方法、能擷取到屬性。我們現在通過反射來調用一下say方法。不是以前我們通過對象去調用。而是反射。

Java學習裡程-----Java基礎_24 Java 反射機制(下)八、通過反射調用類中的方法九、Class<?>... parameterTypes十、如何給參數的問題

從這裡開始看起,我們現在已經擷取到了Class類,

然後我們進行一下執行個體化,并且給兩個參數

Java學習裡程-----Java基礎_24 Java 反射機制(下)八、通過反射調用類中的方法九、Class<?>... parameterTypes十、如何給參數的問題

執行個體化之後,我們指派給一個Object。

然後我們調用一下say方法。

Java學習裡程-----Java基礎_24 Java 反射機制(下)八、通過反射調用類中的方法九、Class<?>... parameterTypes十、如何給參數的問題

我們發現并沒有say方法。原因這是Object類,say方法是我們定義在了包子這個内部類中的。通過Object肯定調用不到。

那我們怎麼辦呢?我們這麼來操做。

固定套路啊,記住即可。

先用object .getClass(),然後,在調用.getMethod(),這時候可以填寫參數,我們來看一下這個getMethod()方法的源碼

Java學習裡程-----Java基礎_24 Java 反射機制(下)八、通過反射調用類中的方法九、Class<?>... parameterTypes十、如何給參數的問題

第一個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方法進行調用。

這裡也得需要傳入一個參數,我們看一下源碼需要傳入什麼參數

Java學習裡程-----Java基礎_24 Java 反射機制(下)八、通過反射調用類中的方法九、Class&lt;?&gt;... parameterTypes十、如何給參數的問題

很好,都是我認識的單詞,但是組成句子我就不知道是什麼意思了。Google翻譯一下

Java學習裡程-----Java基礎_24 Java 反射機制(下)八、通過反射調用類中的方法九、Class&lt;?&gt;... parameterTypes十、如何給參數的問題

這也就是說,誰調用的,你放誰就好。

那很明顯,我們是Object這個東西調用的,我們就把它放進去。完整的代碼如下:

Java學習裡程-----Java基礎_24 Java 反射機制(下)八、通過反射調用類中的方法九、Class&lt;?&gt;... parameterTypes十、如何給參數的問題

完美運作。

九、Class<?>... parameterTypes

我們來看一下這個是什麼參數。

我們看這個費勁,我們就弄個簡單的例子:

Java學習裡程-----Java基礎_24 Java 反射機制(下)八、通過反射調用類中的方法九、Class&lt;?&gt;... parameterTypes十、如何給參數的問題

我們看一下輸出什麼

Java學習裡程-----Java基礎_24 Java 反射機制(下)八、通過反射調用類中的方法九、Class&lt;?&gt;... parameterTypes十、如何給參數的問題

輸出了這麼個玩意,我們呢,來使用一下debug斷點來進行看一下(Debug後面我會講如何去使用,先跟我學着用一下)

Java學習裡程-----Java基礎_24 Java 反射機制(下)八、通過反射調用類中的方法九、Class&lt;?&gt;... parameterTypes十、如何給參數的問題

滑鼠移動到箭頭位置,輕按兩下,就會出現這麼一個小點點,這樣我們就是打上斷點了

Java學習裡程-----Java基礎_24 Java 反射機制(下)八、通過反射調用類中的方法九、Class&lt;?&gt;... parameterTypes十、如何給參數的問題

我平時運作程式都會點選類似于播放的内個按鈕,這次我們不要點這個,我們選擇旁邊和蟲子一樣的内個,點選運作。

Java學習裡程-----Java基礎_24 Java 反射機制(下)八、通過反射調用類中的方法九、Class&lt;?&gt;... parameterTypes十、如何給參數的問題

點選switch,然後界面就會變成這樣

Java學習裡程-----Java基礎_24 Java 反射機制(下)八、通過反射調用類中的方法九、Class&lt;?&gt;... parameterTypes十、如何給參數的問題

這樣就進入了debug模式,我們把滑鼠移動到abc上,

Java學習裡程-----Java基礎_24 Java 反射機制(下)八、通過反射調用類中的方法九、Class&lt;?&gt;... parameterTypes十、如何給參數的問題

很明顯啊,這是一個數組,也就是說,String... abc居然是個數組。然後我們按F8。

知道了這是個數組,我們就需要些一個循環去周遊擷取值。

Java學習裡程-----Java基礎_24 Java 反射機制(下)八、通過反射調用類中的方法九、Class&lt;?&gt;... parameterTypes十、如何給參數的問題

但是如何添加值呢?我們總不能就添加一個asdfa這麼個東西吧。其實,直接填寫即可。

Java學習裡程-----Java基礎_24 Java 反射機制(下)八、通過反射調用類中的方法九、Class&lt;?&gt;... parameterTypes十、如何給參數的問題

這個按照理想情況可以無限添加,但是,你要是添加的太多了,擠爆記憶體了,那就GG了。

這個String... 叫做可變參數,就是随着你給的參數數量自己改變,這裡不止是可以String 還可以給别的,大家可以自己試一試。

Java學習裡程-----Java基礎_24 Java 反射機制(下)八、通過反射調用類中的方法九、Class&lt;?&gt;... parameterTypes十、如何給參數的問題

十、如何給參數的問題

我們繼續來說主題,剛剛又跑偏了

我們先來改造一下我們的包子類。我們這次随便寫一個方法,給定參數,給定傳回值。

Java學習裡程-----Java基礎_24 Java 反射機制(下)八、通過反射調用類中的方法九、Class&lt;?&gt;... parameterTypes十、如何給參數的問題

順便用一下剛剛學習的。我們來調用一下這個方法

因為我們要傳入的是一個數組,是以我們這麼去寫getMethod

object.getClass().getMethod("getSome", int[].class);

是的,沒有錯,就這麼搞

然後我們建立一個數組a,int[] a = {1,2,3,4,5};

最後我們調用一下使用Method的invoke方法,但是這次我們需要将參數a傳過去,怎麼傳呢?

Java學習裡程-----Java基礎_24 Java 反射機制(下)八、通過反射調用類中的方法九、Class&lt;?&gt;... parameterTypes十、如何給參數的問題

我們直接放進去,然後傳入參數

Java學習裡程-----Java基礎_24 Java 反射機制(下)八、通過反射調用類中的方法九、Class&lt;?&gt;... parameterTypes十、如何給參數的問題

運作一下

Java學習裡程-----Java基礎_24 Java 反射機制(下)八、通過反射調用類中的方法九、Class&lt;?&gt;... parameterTypes十、如何給參數的問題

但是還沒有完,我們最後傳回了一個參數OK,這個怎麼擷取?

其實看method的invoke源碼你會看到,他會傳回一個Object,這個就是我們調用的方法所傳回的參數,我們用一個Object接收一下,然後輸出

Java學習裡程-----Java基礎_24 Java 反射機制(下)八、通過反射調用類中的方法九、Class&lt;?&gt;... parameterTypes十、如何給參數的問題

感謝大家支援,記得點個關注,老司機帶你上高速。

繼續閱讀