Class对象表示所载入的类,取得Class对象之后,您就可以取得与类上相关联的信息,像是
package、构造函数、方法、数据成员等等的讯息,而每一个讯息,也会有相应的对象作为其代表。
例如下面这个程序可以让您取得类所属的package名称:
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等对象,分别代表数据成员、构造函数与方法,下面这个程序简单的示范了一
些类基本信息的取得:
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文件得到更多的讯息。 |