Java如何透過反射獲取泛型

反射是Java語言非常重要的一部分,關於反射我前面寫過《

java建立物件除了new,還有其他辦法嗎?

》《

java如何透過反射操作欄位

》。 透過反射,我們可以知道類中某個欄位的型別,並可以對這個欄位進行操作。可是如果一個欄位是泛型的,比如欄位是一個泛型的集合,那怎麼透過反射知道這個欄位的泛型是什麼型別的呢(對泛型不太瞭解的朋友,可以看看《

知道嗎?服務要精準有針對性——java泛型

》)?

Java如何透過反射獲取泛型

今天我就帶大家解決一下這個問題。

先看看我們要反射的類。

Java如何透過反射獲取泛型

類中有兩個欄位list、map。list是一個泛型為Sting的List集合,map是一個key為Integer型別,value為String型別的Map。

下面看看怎麼透過反射獲取到這兩個欄位的泛型。

Java如何透過反射獲取泛型

這段程式碼中可以看到我先是拿到了Demo這個類對應的Class物件,然後透過這個物件的getDeclaredField方法可以獲取到list、map這兩個欄位的Field物件。

透過Field物件的getType方法我們可以知道這個欄位是什麼型別的,比如我們這裡的List和Map,但是無法知道泛型是什麼。要知道泛型是什麼需要先使用Field物件的getGenericType方法來獲取到這個欄位的和泛型相關的Type物件(一個引數化的物件)。

然後下面呼叫了個show方法,這個方法是我自己包裝了一下,因為接下來我們對這兩個欄位獲取泛型的操作就是一樣的了。

Java如何透過反射獲取泛型

泛型相關的欄位的型別是一個引數化的型別(ParameterizedType),這裡我只是演示,就沒有對其他型別進行判斷處理了。

然後這個引數化的型別透過getActualTypeArguments()就可以獲取到對應的泛型型別了。

執行一下看看結果吧。

Java如何透過反射獲取泛型

恩,泛型正確地獲取到了。

今天的任務也就完成了。

想了解更多精彩內容,快來關注軟體開發領路人