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 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;
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值