Java 按 Bootstrap → Extension → Application 三級 Classpath 載入類。同一 JVM 中允許同名類由不同類加載器載入(視為不同類型),但默認機制下:
public class RestrictedURLClassLoader extends URLClassLoader {
public RestrictedURLClassLoader(URL[] urls) {
super(urls, null); // 斷開父加載器鏈
}
@Override
public Class loadClass(String name) throws ClassNotFoundException {
Class cls = super.loadClass(name); // 僅搜索指定 URLs
if (cls == null) {
throw new ClassNotFoundException("Restricted ClassLoader unable to find: " + name);
}
return cls;
}
}
關鍵點:super(urls, null) 切斷委託父加載器,強制在指定 JAR 範圍內搜索,實現命名空間隔離。
<component name="com.jeffhanson.components.HelloWorld">
<component-archive>HelloWorldComponentV1.jar</component-archive>
<ancillary-resources>
<ancillary-resource>log4j-1.2.12.jar</ancillary-resource>
<ancillary-resource>concurrent-1.3.4.jar</ancillary-resource>
</ancillary-resources>
</component>
版本升級只需修改 component-archive 值,輔助資源保持不變。
RestrictedURLClassLoaderloadClass + 反射實例化組件主類
圖 1:多類加載器創建隔離命名空間

圖 2:組件容器框架類關係

圖 3:組件創建序列圖
同一 JVM 內同時實例化 V1、V2 兩版本組件,調用各自業務方法,輸出互不干擾,完美實現「同類異版共存」。
利用類加載器命名空間機制,構建自包含的組件容器框架,將類加載約束到指定 JAR,解決依賴地獄與版本衝突,為插件化架構、熱插拔、多租戶隔離奠定基礎。