Mega Code Archive

 
Categories / Java / Generics
 

Generic Reflection Test

/*    This program is a part of the companion code for Core Java 8th ed.    (http://horstmann.com/corejava)    This program is free software: you can redistribute it and/or modify    it under the terms of the GNU General Public License as published by    the Free Software Foundation, either version 3 of the License, or    (at your option) any later version.    This program is distributed in the hope that it will be useful,    but WITHOUT ANY WARRANTY; without even the implied warranty of    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the    GNU General Public License for more details.    You should have received a copy of the GNU General Public License    along with this program.  If not, see <http://www.gnu.org/licenses/>. */ 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.Arrays; import java.util.Scanner; /**  * @version 1.10 2007-05-15  * @author Cay Horstmann  */ public class GenericReflectionTest {    public static void main(String[] args)    {       // read class name from command line args or user input       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.next();       }       try       {          // print generic info for class and public methods          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("[]");       }    } }