Java 采用泛型擦除机制引入泛型,Java 中的泛型仅仅是给编译器 javac 使用的,确保数据的安全性和免去强制类型转换问题,但是,一旦编译完成,所有和泛型有关的类型全部擦除。
为了通过反射操作这些类型,Java 新增了
- ParameterizedType
- GenericArrayType
- TypeVariable
- WildcardType
集中类型代表不能被归一到 Class 类中的类型但是又和原始类型齐名的类型。
ParamterizedType
- 表示一种参数化类型,比如
Collection<String>
GenericArrayType
TypeVariable
WildcardType
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53
| package com.redisc;
import java.lang.reflect.*; import java.util.List; import java.util.Map;
public class Test {
public void test1(Map<String, Integer> map, List<Integer> list) {
}
public Map<String, Integer> test2() { return null; }
public static void main(String[] args) throws ClassNotFoundException, NoSuchFieldException, NoSuchMethodException, IllegalAccessException, InvocationTargetException, InstantiationException { Method method = Test.class.getMethod("test1", Map.class, List.class);
Type[] types = method.getGenericParameterTypes(); // 获取范型的参数类型 for (Type type : types) { if (type instanceof ParameterizedType) { // 是不是参数化类型 Type[] arguments = ((ParameterizedType) type).getActualTypeArguments(); for (Type type1 : arguments) { System.out.println(type1); } } }
Method method2 = Test.class.getMethod("test2", null); Type type2 = method2.getGenericReturnType(); // 获取范型的返回值类型 if (type2 instanceof ParameterizedType) { // 是不是参数化类型 Type[] arguments = ((ParameterizedType) type2).getActualTypeArguments(); for (Type type1 : arguments) { System.out.println(type1); } }
} }
|