泛型反射

来源:互联网 发布:php移动接口开发 编辑:程序博客网 时间:2024/05/16 19:10
import java.lang.reflect.GenericArrayType;import java.lang.reflect.Method;import java.lang.reflect.Modifier;import java.lang.reflect.ParameterizedType;import java.lang.reflect.Type;import java.lang.reflect.TypeVariable;import java.lang.reflect.WildcardType;import java.util.Scanner;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.Date):");name = in.next();}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(),"<",",",">");Type sc = cl.getGenericSuperclass();if(sc!=null){System.out.print(" extends ");printType(sc);}printTypes(cl.getGenericInterfaces()," implements ",",","");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(),"<",",",">");printType(m.getGenericReturnType());System.out.print(" ");System.out.print(name);System.out.print("(");printTypes(m.getGenericParameterTypes(),"",",","");System.out.println(")");}public static void printTypes(Type[] types,String pre,String sep,String suf){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]);}if(types.length > 0) System.out.print(suf);}public static void printType(Type type){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());printTypes(t.getBounds()," extends ","&","");}else if(type instanceof WildcardType){WildcardType t = (WildcardType) type;System.out.print("?");printTypes(t.getLowerBounds()," extends "," & ","");printTypes(t.getUpperBounds()," super "," & ","");}else if(type instanceof ParameterizedType){ParameterizedType t = (ParameterizedType) type;Type owner = t.getOwnerType();if(owner != null){printType(owner);System.out.print(".");}printType(t.getRawType());printTypes(t.getActualTypeArguments(),"<",",",">");}else if(type instanceof GenericArrayType){GenericArrayType t = (GenericArrayType) type;System.out.print("");printType(t.getGenericComponentType());System.out.print("[]");}}}