Class 物件表示所載入的類別,取得Class物件之後,你就可以取得與類別相關聯的資訊,像是套件(package)(別忘了package也是類別名稱的一部 份)、建構方法、方法成員、資料成員等的訊息,而每一個訊息,也會有相應的類別型態,例如套件的對應型態是java.lang.Package,建構方法 的對應型態是java.lang.reflect.Constructor,方法成員的對應型態是java.lang.reflect.Method,資 料成員的對應型態是java.lang.reflect.Field等。
來看個簡單的示範,以下可以讓您取得所指定類別上的套件名稱:
try {
Class c = Class.forName(args[0]);
Package p = c.getPackage();
System.out.println(p.getName());
}
catch(ArrayIndexOutOfBoundsException e) {
System.out.println("沒有指定類別");
}
catch(ClassNotFoundException e) {
System.out.println("找不到指定類別");
}
你可以分別取回Field、Constructor、Method等物件,分別代表資料成員、建構方法與方法成員,以下範例簡單地實作了取得類別基本資訊的程式:
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());
// 取得型態修飾,像是class、interface
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) {
// 顯示權限修飾,像是public、protected、private
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) {
// 顯示權限修飾,像是public、protected、private
System.out.print("\t" + Modifier.toString(
constructor.getModifiers()));
// 顯示建構方法名稱
System.out.println(" " + constructor.getName() + "();");
}
// 取得宣告的方法成員代表物件
Method[] methods = c.getDeclaredMethods();
for(Method method : methods) {
// 顯示權限修飾,像是public、protected、private
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("找不到指定類別");
}
}
}
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());
// 取得型態修飾,像是class、interface
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) {
// 顯示權限修飾,像是public、protected、private
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) {
// 顯示權限修飾,像是public、protected、private
System.out.print("\t" + Modifier.toString(
constructor.getModifiers()));
// 顯示建構方法名稱
System.out.println(" " + constructor.getName() + "();");
}
// 取得宣告的方法成員代表物件
Method[] methods = c.getDeclaredMethods();
for(Method method : methods) {
// 顯示權限修飾,像是public、protected、private
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("找不到指定類別");
}
}
}