反射是Java語言非常重要的一部分,關於反射我前面寫過《
java建立物件除了new,還有其他辦法嗎?
》《
java如何透過反射操作欄位
》。 透過反射,我們可以知道類中某個欄位的型別,並可以對這個欄位進行操作。可是如果一個欄位是泛型的,比如欄位是一個泛型的集合,那怎麼透過反射知道這個欄位的泛型是什麼型別的呢(對泛型不太瞭解的朋友,可以看看《
知道嗎?服務要精準有針對性——java泛型
》)?
今天我就帶大家解決一下這個問題。
先看看我們要反射的類。
類中有兩個欄位list、map。list是一個泛型為Sting的List集合,map是一個key為Integer型別,value為String型別的Map。
下面看看怎麼透過反射獲取到這兩個欄位的泛型。
這段程式碼中可以看到我先是拿到了Demo這個類對應的Class物件,然後透過這個物件的getDeclaredField方法可以獲取到list、map這兩個欄位的Field物件。
透過Field物件的getType方法我們可以知道這個欄位是什麼型別的,比如我們這裡的List和Map,但是無法知道泛型是什麼。要知道泛型是什麼需要先使用Field物件的getGenericType方法來獲取到這個欄位的和泛型相關的Type物件(一個引數化的物件)。
然後下面呼叫了個show方法,這個方法是我自己包裝了一下,因為接下來我們對這兩個欄位獲取泛型的操作就是一樣的了。
泛型相關的欄位的型別是一個引數化的型別(ParameterizedType),這裡我只是演示,就沒有對其他型別進行判斷處理了。
然後這個引數化的型別透過getActualTypeArguments()就可以獲取到對應的泛型型別了。
執行一下看看結果吧。
恩,泛型正確地獲取到了。
今天的任務也就完成了。
想了解更多精彩內容,快來關注軟體開發領路人