java中反射的泛型简介说明
下文笔者讲述反射中泛型的获取方法分享,如下所示:
java反射之泛型 GenericArrayType:描述数组 参数/变量 类型,例如:T[] ParameterizedType:描述泛型参数类型,例如:Collection<String> TypeVariable:描述泛型 的完整类型,例如 T WildcardType:描述统配符的,例:? extends A例:
public class GenericReflectionTest { public static void main(String[] args) { String name; if(args.length > 0) name = args[0]; else{ Scanner in = new Scanner(System.in); System.out.println("Enter class name(e.g. java.util.Collections)"); name = in.nextLine(); } try{ Class cl = Class.forName(name); printClass(cl); for(Method m:cl.getDeclaredMethods()){ printMethod(m); } }catch (ClassNotFoundException e){ e.printStackTrace(); } } public static void printClass(Class cl){ System.out.print(cl); printTypes(cl.getTypeParameters(),"<",",",">",true); Type sc = cl.getGenericSuperclass(); if(sc!=null){ System.out.print(" extends "); printType(sc, false); } printTypes(cl.getGenericInterfaces(), " implements ",",", "",false); System.out.println(); } public static void printMethod(Method m){ String name = m.getName(); System.out.print(Modifier.toString(m.getModifiers())); System.out.print(" "); printTypes(m.getTypeParameters(),"<",",","> ",true); printType(m.getGenericReturnType(),false); System.out.print(" "); System.out.print(name); System.out.print("("); printTypes(m.getGenericParameterTypes(),"",",","",false); System.out.println(");"); } public static void printTypes(Type[] types, String pre, String sep, String suf, boolean isDefinition){ if(pre.equals(" extends ") && Arrays.equals(types, new Type[]{Object.class})) return; if(types.length > 0) System.out.print(pre); for(int i = 0; i < types.length; i++){ if(i > 0) System.out.print(sep); printType(types[i], isDefinition); } if(types.length>0) System.out.print(suf); } public static void printType(Type type, boolean isDefinition){ if(type instanceof Class){ Class t = (Class) type; System.out.print(t.getName()); }else if(type instanceof TypeVariable){ TypeVariable t = (TypeVariable) type; System.out.print(t.getName()); if(isDefinition) printTypes(t.getBounds(), " extends ", " & ","", false); }else if(type instanceof WildcardType){ WildcardType t = (WildcardType) type; System.out.print("?"); printTypes(t.getUpperBounds()," extends "," & ","",false); printTypes(t.getLowerBounds(), " super ", " & ","", false); }else if(type instanceof ParameterizedType){ ParameterizedType t = (ParameterizedType) type; Type owner = t.getOwnerType(); if(owner!=null){ printType(owner, false); System.out.print("."); } printType(t.getRawType(), false); printTypes(t.getActualTypeArguments(), "<",", ",">",false); }else if(type instanceof GenericArrayType){ GenericArrayType t = (GenericArrayType) type; System.out.print(""); printType(t.getGenericComponentType(),isDefinition); System.out.print("[]"); } } }
版权声明
本文仅代表作者观点,不代表本站立场。
本文系作者授权发表,未经许可,不得转载。