Java學習里程-----Java基礎_24 Java 反射機制(中)

接着上一篇繼續,沒有看的:《Java學習里程-----Java基礎_24 Java 反射機制(上)》

六、反射的具體使用

類似目錄五,我們不會用這麼牛逼的事情,就爲了輸出一個name的。下面我來說一下,我們用反射具體乾的事情。

還是剛剛內個ClassTest類,我們還用這個繼續學習

需求:實例化包子,然後我們給包子中放入餡料,制定一個價錢給它,並且輸出一下

知道了需求,我們開始操作。

我們已經獲取到了這個類,但是我們如何進行實例化,這裏呢,Class類中給我們提供了一個方法。newInstance(),我們先來看一下源碼。

是吧,說的很明白,調用這個就像我們new一個對象一樣。

然後我們可以調用該函數實例化對象。我們來使用一下。

可以看到,返回值是一個Object,當然,我們這裏不需要使用Object,因爲我們已經知道了這個類是什麼,所以,我們直接強制類型轉換。

實例化完成,然後我們看需求,需求上說給一個名字,還有價格,我們這裏操作一下(這裏還設計到封裝的概念)

順便連輸出也寫了,我們運行一下程序

沒問題。是OK的。

現在我們給包子這個類添加一個有參構造方法,我們再來運行一下剛剛的程序。

很好,報錯了。

從報錯內容上看,是找不到構造方法,那麼就奇怪了,我們明明給的有參構造方法,但是,卻找不到。

我和大家說一下原因:因爲這樣去實例化類的時候,調用的是無參構造方法,而我們內部類中並沒有無參構造方法,因爲我沒有寫,我們裏面只有一個有參構造方法。這裏涉及到了基礎知識,不紮實的我建議好好學學基礎。

我們這裏有兩種解決方法。1 就是你多加一個有參構造方法,2 你得需要指定構造方法

第一種方法:

是OK的,沒有問題,我們來看一下第二種怎麼去弄

第二種方法:

第二種方法我們是這樣做的,java.lang.Class 這個類給我們提供了方法,能夠讓我們獲取到某個類中的構造方法。

getConstructors(),就這個方法,返回的是一個Constructor<?>[] 這樣的數組,爲啥是數組呢?大家可以自己想一下,很簡單。

然後數組我們獲取第一個,進行實例化, 因爲我們知道,我們這個包子內部類就一個構造函數。

然後我們輸出一下。

OK的。

如果有多個構造方法,我們還能用循環將所有的構造方法進行輸出。

七、通過反射獲取類中的屬性和方法

我們呢,也可以通過反射進行獲取屬性和方法,下面我們來說一下。

獲取屬性:

獲取屬性,我們是使用的java.lang.ClassgetMethods() 這個方法。通過這個方法,我們能獲取到一個Method的數組,我們循環輸出一下,看看是什麼(注意,method的包是這個:java.lang.reflect.Method 別導入錯誤)

可以看到輸出了一大堆,而且裏面有我們寫的方法。

但是,這些框起來的方法其實並不是我們包子類中的方法,那麼這些方法是哪裏來的呢?

這個又涉及到基礎知識了。Object是所有類的父類,所有的類默認都是要繼承Object的,所以這些方法都是父類提供的,只是我們沒有重寫而已。

除去方法,我們還能獲取到屬性,獲取屬性,我們是用getDeclaredFields() 這個方法,和method一樣,這個獲取到的也是數組。

看清楚獲取的數組所要引入的類:java.lang.reflect.Field 是這個,別弄錯了。

同樣,我們使用循環,來看看有那些屬性。

就倆,是的,沒有問題

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章