Java 用 Class 物件實現 RTTI。Class 類別提供大量方法方便使用。
Class.forName("類別名稱"):字串參數,無需該型別物件即可取得 Class 參考getClass()(Object 方法):回傳物件實際型別的 Class 參考
//: ToyTest.java
interface HasBatteries {} interface Waterproof {} interface ShootsThings {}
class Toy { Toy() {} Toy(int i) {} }
class FancyToy extends Toy implements HasBatteries, Waterproof, ShootsThings {
FancyToy() { super(1); }
}
public class ToyTest {
public static void main(String[] args) {
Class c = null;
try { c = Class.forName("FancyToy"); } catch(ClassNotFoundException e) {}
printInfo(c);
Class[] faces = c.getInterfaces();
for(int i = 0; i < faces.length; i++) printInfo(faces[i]);
Class cy = c.getSuperclass();
Object o = null;
try { o = cy.newInstance(); } catch(InstantiationException e) {} catch(IllegalAccessException e) {}
printInfo(o.getClass());
}
static void printInfo(Class cc) {
System.out.println("Class name: " + cc.getName() + " is interface? [" + cc.isInterface() + "]");
}
} ///:~
getInterfaces():回傳介面陣列getSuperclass():回傳直接基類 Class 參考,可遞迴查詢完整繼承層級newInstance():虛擬建構子。無現成物件也能建立新實例。cy 僅為 Class 參考,編譯期不知型別,卻能表達「不管你是什麼型別,正確建立自己」。需預設建構子,Java 1.1 反射 API 可動態使用任何建構子。getName()、isInterface():查詢名稱與是否為介面Class name: FancyToy is interface? [false] Class name: HasBatteries is interface? [true] Class name: Waterproof is interface? [true] Class name: ShootsThings is interface? [true] Class name: Toy is interface? [false]
利用 Class 物件幾乎能查清物件的「祖宗十八代」。