From Gossip@Openhome

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