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