Реализация загрузчика классов фильтрации - PullRequest
7 голосов
/ 22 июня 2010

Мы расширяем наше 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;
    }
}

Однако, на мой взгляд, у этого есть несколько проблем:

  1. Использование отдельного URLClassLoader только для того, чтобы увидеть, должен ли классФильтр для меня выглядит как хак.
  2. Когда плагин загружает класс, этот родительский загрузчик класса будет системным загрузчиком класса, что, очевидно, противоречит всей цели того, чего я пытаюсь достичь.

Как вы решаете эту проблему?

Ответы [ 2 ]

2 голосов
/ 22 июня 2010

Если мы решим отделить Java-фреймворк от другого загрузчика классов и использовать его как родительский для загрузчика классов плагинов, Java-каркас не будет виден нашим собственным классам.

Поместите ваш код в загрузчик классов, который является партнером загрузчика классов плагинов, оба с загрузчиком классов кода интерфейса в качестве родителя.

2 голосов
/ 22 июня 2010

Как вы решаете эту проблему?

Альянс OSGi уже сделал.Статья в Википедии о OSGi Framework может дать вам несколько идей.

Возможно, вы захотите взглянуть на исходный код Eclipse и посмотреть, как они реализовали подключаемый модульзагрузка.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...