標籤:java 反射
利用反射分析類能力的類的源碼如下(來源於《Java核心技術》卷一):
package testreflection;import java.util.*;import java.lang.reflect.*;/** * 這個類利用反射列印出一個類的所有特徵 * * @version 1.1 2004-02-21 * @author Cay Horstmann */public class ReflectionTest {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 {// 列印類名和超類名(如果超類不是Object的話)Class cl = Class.forName(name);Class supercl = cl.getSuperclass();// 獲得類或介面的修飾符,不過是這個修飾符被編碼後的整數int mi = cl.getModifiers();System.out.println(mi);// 獲得整數代表的實際的修飾符String modifiers = Modifier.toString(mi);System.out.println(modifiers);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();}}/** * 列印一個類的所有構造器 * @param cl a class */public static void printConstructors(Class cl) {/** * Constructor類用於描述類的構造器; * cl.getDeclaredConstructors()返回類中聲明的全部 * 構造器,不包括父類中的 */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 + "(");// 列印參數類型列表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(");");}}/** * 列印一個類的所有方法 * @param cl a class */public static void printMethods(Class cl) {/** * Method類用於描述類的方法; * cl.getDeclaredMethods()返回類中聲明的全部方法, * 不包括父類中的 */Method[] methods = cl.getDeclaredMethods();for (Method m : methods) {// 獲得描述傳回型別所屬類型的Class對象Class retType = m.getReturnType();// 獲得方法名String name = m.getName();System.out.print(" ");// 列印修飾符,傳回型別和方法名String modifiers = Modifier.toString(m.getModifiers());if (modifiers.length() > 0) {System.out.print(modifiers + " ");}System.out.print(retType.getName() + " " + name + "(");// 列印參數類型列表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(");");}}/** * 列印一個類的所有域 * @param cl a class */public static void printFields(Class cl) {/** * Field類用於描述類的域; * cl.getDeclaredFields()返回類中聲明的全部域, * 不包括父類中的 */Field[] fields = cl.getDeclaredFields();for (Field f : fields) {// 獲得描述域所屬類型的Class對象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 + ";");}}}
這裡有一個待分析的類:
package testreflection;public class Student extends Person {private static int count;private String stuNum;public Student() {super();// TODO Auto-generated constructor stubcount++;}public Student(String name, int age, boolean gender, String stuNum) {super(name, age, gender);// TODO Auto-generated constructor stubthis.stuNum = stuNum;count++;}public String getStuNum() {return stuNum;}public void setStuNum(String stuNum) {this.stuNum = stuNum;}public static int getCount() {return count;}}
Student類的父類Person類的源碼如下:
package testreflection;public class Person {private String name;private int age;private boolean gender;public Person() {// TODO Auto-generated constructor stub}public Person(String name, int age, boolean gender) {super();this.name = name;this.age = age;this.gender = gender;}public String getName() {return name;}public void setName(String name) {this.name = name;}public int getAge() {return age;}public void setAge(int age) {this.age = age;}public boolean isGender() {return gender;}public void setGender(boolean gender) {this.gender = gender;}}
利用ReflectionTest類分析Student類的結果如下:
1
public
public class testreflection.Student extends testreflection.Person
{
public testreflection.Student();
public testreflection.Student(java.lang.String, int, boolean, java.lang.String);
public static int getCount();
public void setStuNum(java.lang.String);
public java.lang.String getStuNum();
private static int count;
private java.lang.String stuNum;
}
著作權聲明:本文為博主原創文章,未經博主允許不得轉載。
Java反射(二)利用反射分析類的能力