反射操作泛型
阿新 • • 發佈:2021-01-06
反射操作泛型
- Java採用泛型擦除的機制來引用泛型,Java中的泛型僅僅是給編譯器Javac使用的,確保資料的安全性和免去強制型別轉換問題,但是,一旦編譯完成,所有和泛型有關的型別全部擦除。
- 為了通過反射操作這些型別,Java新增了ParameterizedType,GenericArrayType,TypeVariable和WildcardType幾種型別來代表不能被歸一到Class類中的型別但是又和原始型別齊名的型別
- ParameterizedType:表達一種引數化型別,比如 Collection
- GenericArrayType:表示一種元素型別是引數化型別或者型別變數的陣列型別
- TypeVariable: 是各種型別變數的公共父介面
- WildcardType: 代表一種萬用字元型別表示式
案例
package Reflection;
import java.lang.reflect.Method;
import java.lang.reflect.ParameterizedType;
import java.lang.reflect.Type;
import java.util.List;
import java.util.Map;
//通過反射獲取泛型
public class Test10 {
public void test01(Map<String, User> map, List<User> list){
System.out.println("test01");
}
public Map<String,User> test02(){
System.out.println(test02());
return null;
}
public static void main(String[] args) throws NoSuchMethodException {
Method method = Test10. class.getMethod("test01", Map.class, List.class);
Type[] genericParameterTypes = method.getGenericParameterTypes();
for (Type genericParameterType : genericParameterTypes) {
System.out.println("###"+genericParameterType);
if (genericParameterType instanceof ParameterizedType){
Type[] actualTypeArguments = ((ParameterizedType) genericParameterType).getActualTypeArguments();
for (Type typeArgument : actualTypeArguments) {
System.out.println("============");
System.out.println(typeArgument);
}
}
}
System.out.println("----------");
method = Test10.class.getMethod("test02");
Type genericReturnType = method.getGenericReturnType();
if (genericReturnType instanceof ParameterizedType) {
Type[] actualTypeArguments = ((ParameterizedType) genericReturnType).getActualTypeArguments();
for (Type typeArgument : actualTypeArguments) {
System.out.println("============");
System.out.println(typeArgument);
}
}
}
}