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文件得到更多的讯息。