ITEEDU

Java Gossip: 从 Class 中获取信息

Class对象表示所加载的类别,取得Class对象之后,您就可以取得与类别上相关联的信息,像是 package、建构函式、方法、数据成员等等的讯息,而每一个讯息,也会有相应的对象作为其代表。

例如下面这个程序可以让您取得类别所属的package名称:

ClassDemo.java
package onlyfun.caterpillar;
public class ClassDemo {
	public static void main(String[] args) {
		try {
			Class c = Class.forName(args[0]);
			Package p = c.getPackage();
			System.out.println(p.getName());
		}
		catch(ClassNotFoundException e) {
			e.printStackTrace();
		}
	}
}

Package对象是package的代表,一个执行的结果如下:

java ClassDemo java.util.ArrayList
java.util

同样的道理,您可以分别取回Field、Constructor、Method等对象,分别代表数据成员、建构子与方法,下面这个程序简单的示范了一 些类别基本信息的取得:

SimpleClassViewer.java
package onlyfun.caterpillar;
import java.lang.reflect.*;
public class SimpleClassViewer {
	public static void main(String[] args) {
		try {
			Class c = Class.forName(args[0]);
			Package p = c.getPackage();
			System.out.printf("package %s;%n", p.getName());
			int m = c.getModifiers();
			System.out.print(Modifier.toString(m) + " ");
			if(Modifier.isInterface(m)) {
				System.out.print("interface ");
			}
			else {
				System.out.print("class ");
			}
			System.out.println(c.getName() + " {");
			Field[] fields = c.getDeclaredFields();
			for(Field field : fields) {
				System.out.print("\t" +
				Modifier.toString(field.getModifiers()));
				System.out.print(" " +
				field.getType().getName() + " ");
				System.out.println(field.getName() + ";");
			}
			Constructor[] constructors =
			c.getDeclaredConstructors();
			for(Constructor constructor : constructors) {
				System.out.print("\t" +
				Modifier.toString(
				constructor.getModifiers()));
				System.out.println(" " +
				constructor.getName() + "();");
			}
			Method[] methods = c.getDeclaredMethods();
			for(Method method : methods) {
				System.out.print("\t" +
				Modifier.toString(
				method.getModifiers()));
				System.out.print(" " +
				method.getReturnType().getName() + " ");
				System.out.println(method.getName() + "();");
			}
			System.out.println("}");
		}
		catch(ArrayIndexOutOfBoundsException e) {
			System.out.println("没有指定类别");
		}
		catch(ClassNotFoundException e) {
			System.out.println("找不到指定类别");
		}
	}
}

执行结果:

java onlyfun.caterpillar.SimpleClassViewer java.util.ArrayList
package java.util;
public class java.util.ArrayList {
	private static final long serialVersionUID;
	private transient [Ljava.lang.Object; elementData;
	private int size;
	public java.util.ArrayList();
	public java.util.ArrayList();
	public java.util.ArrayList();
	public boolean add();
	public void add();
	public java.lang.Object clone();
	public void clear();
	public boolean contains();
	public int indexOf();
	public int lastIndexOf();
	public boolean addAll();
	public boolean addAll();
	public java.lang.Object get();
	public int size();
	public [Ljava.lang.Object; toArray();
	public [Ljava.lang.Object; toArray();
	public boolean remove();
	public java.lang.Object remove();
	private void writeObject();
	public boolean isEmpty();
	private void readObject();
	public java.lang.Object set();
	public void ensureCapacity();
	protected void removeRange();
	public void trimToSize();
	private void RangeCheck();
	private void fastRemove();
}

一些类别检视器的实作原理基本上就是上面这个程序所示范的,当然还可以取得更多的信息,您可以参考Class的在线API文件得到更多的讯息。