我們正在擴展我們的java應用程序以支持插件。其中一部分內容包括將插件與我們自己的類隔離開來,因此每個插件都將存在於它自己的類加載器中。實現過濾類加載器
我們也計劃給插件一個java框架來處理,因此它必須暴露給插件。這個java框架還包含需要從我們自己的java代碼訪問的類,因此它也必須可以被我們自己的java代碼訪問。
問題是,如果Java框架存在於系統類加載器(我們自己的java代碼所在的地方)中,那麼我們無法爲插件提供我們想要的隔離。如果我們選擇將java框架分離到不同的類加載器並將其用作插件類加載器的父類,那麼java框架對我們自己的類將不可見。
我想到的當前解決方案是實現一個過濾類加載器。 java框架將存在於系統類加載器中,但是此類加載器將過濾來自系統類加載器的所有內容,除了java框架,我將使用此類加載器作爲插件的父類加載器。
這裏有一個粗略的實現它:
public class FilteringClassLoader extends ClassLoader {
private URLClassLoader _internalLoader;
public FilteringClassLoader(ClassLoader parent) {
super(parent);
// load our java framework to this class loader
_internalLoader = new URLClassLoader(...)
}
public Class<?> loadClass(String name) throws ClassNotFoundException {
// first, try to load from our internal class loader
// that only sees the java framework if that works, load the class
// from the system class loader and return that. otherwise, the class
// should be filtered out and the call to loadClass will throw as expected
_internalLoader.loadClass(name);
Class<?> retClazz = super.loadClass(name);
return retClazz;
}
}
然而,這有幾個問題我看到它的方式:
- 使用單獨的URLClassLoader只看到是否應該過濾類感覺一個黑客給我。
- 當一個插件加載一個類時,該類的父類加載器將成爲系統類加載器,這明顯破壞了我試圖實現的全部目的。
您如何解決這類問題?
這與在JRE庫中引入'com.sun'包的依賴關係的人有什麼不同嗎?還是有進一步的限制? – McDowell 2010-06-22 11:10:19
不知道你的意思 – 2010-06-22 13:14:23