Java反射(二)利用反射分析类的能力

来源:互联网 发布:淘宝店铺中差评的修改 编辑:程序博客网 时间:2024/04/28 08:08

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

0 0
原创粉丝点击