| 方法 | 返回類型 | 是否需導入類 | 適用場景 |
|---|---|---|---|
obj.getClass().getName() | String(全限定名) | 否 | 日誌、序列化、動態載入 |
obj.getClass().getSimpleName() | String(簡短名) | 否 | 除錯顯示、簡單判斷 |
obj instanceof Type | boolean | 是(編譯期可見) | 類型安全檢查、多態分發 |
obj.getClass() == Type.class | boolean | 是 | 精確類型匹配(不含子類) |
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.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。切勿濫用字串比較類名。