public class GenericDemo {
public static void main(String[] args) {
// 原生类型 int long float
Class<Integer> integerClass = int.class;
// 数组类型
Class<Object[]> aClass = Object[].class;
// 原始类型
Class<String> stringClass = String.class;
// 泛型参数类型 AbstractList<E>
ParameterizedType paramType = (ParameterizedType) ArrayList.class.getGenericSuperclass();
System.out.println(paramType);
// 类型变量 <E>
Type[] types = paramType.getActualTypeArguments();
Arrays.stream(paramType.getActualTypeArguments()).forEach(System.out::println);
}
}
Spring中的泛型辅助类
案例演示:
public class GenericTypeResolverDemo {
public static void main(String[] args) throws NoSuchMethodException {
// 这里表示接口是Comparable 但是我们所以其实具体化的类就是String
displayReturnTypeGenericInfo(GenericTypeResolverDemo.class, Comparable.class, "getString");
displayReturnTypeGenericInfo(GenericTypeResolverDemo.class, List.class,"getList");
displayReturnTypeGenericInfo(GenericTypeResolverDemo.class, List.class, "getStringList");
displayReturnTypeGenericInfo(GenericTypeResolverDemo.class, List.class, "getObjectList");
// 没有具体化的时候获取的就是 泛型变量 这里打印的就是 String , E
Map<TypeVariable, Type> typeVariableMap = GenericTypeResolver.getTypeVariableMap(StringList.class);
System.out.println(typeVariableMap);
}
public static <E> List<E> getList() {
return null;
}
public static StringList getStringList() {
return null;
}
public static String getString() {
return null;
}
// 这里也是泛型参数具体化 会打印返回类型
public static ArrayList<Object> getObjectList() {
return null;
}
// 泛型参数具体化以后才会返回 才在字节码中有记录
static class StringList extends ArrayList<String> {
}
private static void displayReturnTypeGenericInfo(Class<?> containingClass,Class<?> genericItf, String methodName, Class... argumentsTypes) throws NoSuchMethodException {
Method method = containingClass.getMethod(methodName, argumentsTypes);
Class<?> returnClass = GenericTypeResolver.resolveReturnType(method, containingClass);
// String
System.out.println(String.format("GenericTypeResolver.resolvReturnType %s, %s = %s", methodName, containingClass.getSimpleName(), returnClass));
// 常规类型不具备泛型参数类型 泛型参数具体化以后才有返回
System.out.println(String.format("GenericTypeResolver.resolveReturnTypeArgument %s, %s = %s",methodName, containingClass.getSimpleName(), GenericTypeResolver.resolveReturnTypeArgument(method, genericItf)));
System.out.println("====>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>");
}
}
public static void main(String[] args) throws NoSuchMethodException {
ResolvableType type = ResolvableType.forMethodReturnType(GenericCollectionResolverDemo.class.getMethod("getString"));
System.out.println(type);
}
// 获取泛型参数
ResolvableType generic = type.getSuperType().getGeneric(0);
System.out.println(generic);
// 原生类型
Class<?> resolve = type.resolve();
System.out.println(resolve);