首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 更多程式語言 >> 程式設計綜合問答

Java 獲取對象運行時類型的多種方法與適用場景

     編輯:程式設計綜合問答

核心方法對比

方法返回類型是否需導入類適用場景
obj.getClass().getName()String(全限定名)否日誌、序列化、動態載入
obj.getClass().getSimpleName()String(簡短名)否除錯顯示、簡單判斷
obj instanceof Typeboolean是(編譯期可見)類型安全檢查、多態分發
obj.getClass() == Type.classboolean是精確類型匹配(不含子類)
Type.class.isInstance(obj)boolean是泛型擦除後的運行時檢查

代碼示例


void process(Object obj) {
    // 1. 獲取類名字串(不需預知類型)
    String className = obj.getClass().getName(); // "java.lang.String"
    Log.d("TYPE", "Class: " + className);

    // 2. instanceof 檢查(需編譯期知晓類型)
    if (obj instanceof String) {
        String s = (String) obj;
        Log.d("TYPE", "是 String: " + s);
    }

    // 3. 精確匹配(排除子類)
    if (obj.getClass() == Integer.class) {
        Log.d("TYPE", "純 Integer,非子類");
    }

    // 4. 動態類型判斷(類對象作為參數傳入)
    if (isType(obj, Number.class)) {
        Log.d("TYPE", "Number 或其子類");
    }
}

boolean isType(Object obj, Class<?> clazz) {
    return clazz.isInstance(obj); // 等價於 clazz.cast(obj) != null
}

常見誤區

  • 誤用 getClass().getName().equals("ClassName") 比較:字串比較脆弱,重構易出錯。優先用 instanceof 或 Class.isInstance()。
  • 忽略 null:null.getClass() 拋 NPE,先判空。
  • 混淆編譯時類型與運行時類型:父類引用指向子類對象時,getClass() 返回子類,instanceof 父類也為真。

進階:反射獲取泛型實際類型參數

若需獲取 List<String> 的泛型參數 String,需結合 ParameterizedType:


Field field = clazz.getDeclaredField("stringList");
ParameterizedType type = (ParameterizedType) field.getGenericType();
Class<?> actualClass = (Class<?>) type.getActualTypeArguments()[0]; // String.class

總結

日常開發首選 instanceof(可讀、安全、編譯期檢查);需動態載入、日誌記錄、框架開發時使用 getClass() 系列;精確匹配用 obj.getClass() == Target.class。切勿濫用字串比較類名。

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