java.lang.Class.isAssignableFrom() 是 Java 反射體系中判斷類型關係的核心方法,廣泛應用於框架開發、插件機制、類型安全檢查等場景。本文將從原理、語法、實戰示例三個維度徹底講透這個方法。
用途: 判斷「參數類型」是否為「源類型」的子類、實現類,或與「源類型」相同。若條件滿足,返回 true。
源類型.class.isAssignableFrom(目標類型.class) // 返回 boolean
truepublic static void main(String[] args) {
Class string = java.lang.String.class;
Class object = java.lang.Object.class;
// Object 是 String 的父類 -> true
System.out.println("Object是String父類:" + object.isAssignableFrom(string));
// Object 與 Object 相同 -> true
System.out.println("Object與Object相同:" + object.isAssignableFrom(object));
// String 是 Object 的父類 -> false
System.out.println("String是Object父類:" + string.isAssignableFrom(object));
}
Object是String父類:true
Object與Object相同:true
String是Object父類:false
| 調用語句 | 結果 | 解析 |
|---|---|---|
| Object.class.isAssignableFrom(String.class) | true | String 繼承 Object,符合「子類可賦值給父類」 |
| Object.class.isAssignableFrom(Object.class) | true | 同類型視為可賦值 |
| String.class.isAssignableFrom(Object.class) | false | 父類不可賦值給子類(逆向不成立) |
public void registerProcessor(Class processorType) {
if (!MessageProcessor.class.isAssignableFrom(processorType)) {
throw new IllegalArgumentException("必須實現 MessageProcessor 接口");
}
// 註冊邏輯...
}
if (Plugin.class.isAssignableFrom(clazz)) {
Plugin plugin = (Plugin) clazz.getDeclaredConstructor().newInstance();
pluginManager.register(plugin);
}
public static boolean isCollectionOfType(Collection> coll, Class type) {
return coll.stream().allMatch(obj -> type.isAssignableFrom(obj.getClass()));
}
| 特性 | isAssignableFrom | instanceof |
|---|---|---|
| 操作對象 | Class 對象(類型元數據) | 對象實例 |
| 檢查方向 | 父類檢查子類 | 實例檢查類型 |
| 適用階段 | 編譯期/運行期類型元數據 | 運行期實例判斷 |
| null 處理 | 拋出 NullPointerException | 返回 false |
isAssignableFrom 進行靜態類型關係驗證isInterface() 區分接口與類的實現關係int.class.isAssignableFrom(Integer.class) 返回 false,需用 Integer.TYPE