import java.util.*; import java.lang.reflect.*; /** * This program uses reflection to print all features of a class. * @version 1.1 2004-02-21 * @author Cay Horstmann */ public class ReflectionTest { 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.Date): "); name = in.next(); } try { // print class name and superclass name (if != Object) Class cl = Class.forName(name);//由字符串獲得Class類的對象 Class supercl = cl.getSuperclass(); //cl.getModifiers()返回一個整形數值,用不一樣的位開關描述相似public等修飾符的使用狀況 //Modifier.toString方法,將返回一個描述位開關的字符串。將整形數值轉換爲對應的修飾符的字符串 String modifiers = Modifier.toString(cl.getModifiers()); if (modifiers.length() > 0) System.out.print(modifiers + " "); System.out.print("class " + name); if (supercl != null && supercl != Object.class) System.out.print(" extends " + supercl.getName()); System.out.print("\n{\n"); printConstructors(cl); System.out.println(); printMethods(cl); System.out.println(); printFields(cl); System.out.println("}"); } catch (ClassNotFoundException e) { e.printStackTrace(); } System.exit(0); } /** * Prints all constructors of a class * @param cl a class */ public static void printConstructors(Class cl) { //經過Class類的對象,獲得一個包含Constructor對象的數組,這個對象數組中,包含了Class所描述 //類的全部構造器的信息 Constructor[] constructors = cl.getDeclaredConstructors(); //提取構造器的信息 for (Constructor c : constructors) { String name = c.getName(); System.out.print(" "); String modifiers = Modifier.toString(c.getModifiers()); if (modifiers.length() > 0) System.out.print(modifiers + " "); System.out.print(name + "("); // print parameter types //返回一個用於描述參數類型的Class對象數組 Class[] paramTypes = c.getParameterTypes(); for (int j = 0; j < paramTypes.length; j++) { if (j > 0) System.out.print(", "); System.out.print(paramTypes[j].getName()); } System.out.println(");"); } } /** * Prints all methods of a class * @param cl a class */ public static void printMethods(Class cl) { //返回包含Method對象的數組,返回這個類或者接口的所有方法,可是不包含由超類繼承了的方法 Method[] methods = cl.getDeclaredMethods(); for (Method m : methods) { //返回一個用於描述返回類型的的Class對象 Class retType = m.getReturnType(); String name = m.getName(); System.out.print(" "); // print modifiers, return type and method name String modifiers = Modifier.toString(m.getModifiers()); if (modifiers.length() > 0) System.out.print(modifiers + " "); System.out.print(retType.getName() + " " + name + "("); // print parameter types //返回一個用於描述參數類型的Class對象數組 Class[] paramTypes = m.getParameterTypes(); for (int j = 0; j < paramTypes.length; j++) { if (j > 0) System.out.print(", "); System.out.print(paramTypes[j].getName()); } System.out.println(");"); } } /** * Prints all fields of a class * @param cl a class */ public static void printFields(Class cl) { //返回一個包含Field對象的數組,這些對象記錄了這個類的全部域 Field[] fields = cl.getDeclaredFields(); for (Field f : fields) { Class type = f.getType(); String name = f.getName(); System.out.print(" "); String modifiers = Modifier.toString(f.getModifiers()); if (modifiers.length() > 0) System.out.print(modifiers + " "); System.out.println(type.getName() + " " + name + ";"); } } }