Мы расширяем наше 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 только для того, чтобы увидеть, должен ли классФильтр для меня выглядит как хак.
- Когда плагин загружает класс, этот родительский загрузчик класса будет системным загрузчиком класса, что, очевидно, противоречит всей цели того, чего я пытаюсь достичь.
Как вы решаете эту проблему?