首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> Java 程式設計 >> Java 相關知識

Java RTTI 語法核心:Class 物件、getInterfaces、getSuperclass 與 newInstance 虛擬建構子

     編輯:Java 相關知識

Java 用 Class 物件實現 RTTI。Class 類別提供大量方法方便使用。

取得 Class 參考

  1. Class.forName("類別名稱"):字串參數,無需該型別物件即可取得 Class 參考
  2. 已有物件時呼叫 getClass()(Object 方法):回傳物件實際型別的 Class 參考

ToyTest.java 完整範例

//: 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 物件幾乎能查清物件的「祖宗十八代」。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved