利用反射分析类能力的类的源码如下(来源于《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;
}
}
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;
}