天天看點

【Java】Java反射筆記

反射的作用

在運作時擷取類的資訊。如果沒有反射,則需要由new建立對象,在代碼裡寫死了,若需要使用不同的類型,就需要修改代碼來,執行不同的操作。

例子1:如果有一個簡單的工廠模式:

在沒有反射機制時,若有其他類實作了inter接口,若要通過工廠擷取該類的執行個體,則必須修改factory類,不友善。

現在利用反射機制實作工廠類:

現在無論有多少個類實作了inter接口,我們都不需要修改工廠類。大大簡化了編碼。

例子2:動态代理

動态代理是用一個中間類,在不修改原有代碼的基礎上,做一些額外的動作,例如擴充功能或者同一接口等。

什麼是反射?

官方的話就是:

java反射機制是在運作狀态中,對于任意一個類,都能夠知道這個類的所有屬性和方法;對于任意一個對象,都能夠調用它的任意一個方法和屬性;這種動态擷取的資訊以及動态調用對象的方法的功能稱為java語言的反射機制。

通俗的說就是可以不用在運作之前就确定是哪一個類,而是在運作的時候再去确定。也就是代碼執行到了需要某個類的執行個體化對象的時候,再去找那個類的class對象,從class對象裡擷取到這個類的資訊,并對它進行操作。

這裡class就是反射的基礎,所有的類(包括基本資料類型和void)都有.class來擷取這個class對象。通常有3重方式擷取class對象:

① 類.class;

② class.forname(類的全限定名);

③ 對象.getclass();

例如一般通過<code>aa aa = new aa();</code>來床架一個對象。

利用反射則可以這樣來建立對象(還是利用上邊第一個例子裡的類和接口):

以上兩句話就相當于<code>aa aa = new aa();</code>

這樣寫比直接new的好處在哪呢?

好處就是隻要是實作了inter這個接口的類,隻要傳入類名,就可以調用不同的子類實作。

還可以這樣改:

這樣可以從xml檔案讀取類資訊,上邊的代碼完全可以不用修改,有很好的擴充性。