利用反射分析类能力的类的源码如下(来源于《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 stub count++; } public Student(String name, int age, boolean gender, String stuNum) { super(name, age, gender); // TODO Auto-generated constructor stub this.stuNum = stuNum; count++; } public String getStuNum() { return stuNum; } public void setStuNum(String stuNum) { this.stuNum = stuNum; } public static int getCount() { return count; } }
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; } }
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;
}
版权声明:本文为博主原创文章,未经博主允许不得转载。
原文地址:http://blog.csdn.net/l294265421/article/details/46654319