Мы расширяем наше приложение Java для поддержки плагинов. Часть из них включает в себя сохранение плагинов, изолированных от наших собственных классов, поэтому каждый плагин будет жить в своем собственном загрузчике классов.Реализация загрузчика фильтрационного класса
Мы также планируем предоставить плагинам фреймворк java для работы, поэтому он должен быть открыт для плагинов. Эта java-инфраструктура также содержит классы, которые должны быть доступны из нашего собственного кода Java, поэтому он также должен быть доступен для нашего собственного java-кода.
Проблема в том, что если java-framework живет в загрузчике системного класса (где живет наш собственный 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 только чтобы увидеть, если класс должен быть отфильтрован чувствует взломать меня.
- Когда плагин загружает класс, этот загрузчик родительского класса этого класса будет загрузчиком системного класса, что, очевидно, побеждает цель цели, которую я пытаюсь достичь.
Как вы решаете эту проблему?
Разве это не отличается от людей, представляющих зависимости от пакетов 'com.sun' в библиотеке JRE? Или существуют ли дополнительные ограничения? – McDowell
не уверен, что вы имеете в виду –