Загрузка классов, отсутствующих в пути к классам

Допустим, я скомпилировал сценарий Groovy с помощью Groovyc, который сгенерировал один или несколько файлов .class в файловой системе. Как динамически добавить эти классы в путь к классам из приложения Java, чтобы загрузить их и вызвать их методы? Цель состоит в том, чтобы предварительно скомпилировать сценарии Groovy и сохранить их в базе данных, чтобы можно было выполнять оценку из скомпилированных версий сценариев.


person Tiago Fernandez    schedule 28.07.2010    source источник


Ответы (2)


Вы можете создать экземпляр URLClassLoader. для загрузки новых классов из каталога:

URL dirUrl = new URL("file:/" + "path_to_dir" + "/");             // 1
URLClassLoader cl = new URLClassLoader(new URL[] {dirUrl},
                             getClass().class.getClassLoader());  // 2
Class loadedClass = cl.loadClass("com.xyz.MyClass");
MyClass obj = (MyClass) loadedClass.newInstance();
obj.doSomething();

Строка 1 создает URL в каталоге, где находятся файлы .class.

Строка 2 создает новый экземпляр URLClassLoader. Первый аргумент — это массив URL-адресов, которые будут использоваться в качестве источника. Вы можете указать несколько URL-адресов каталогов в массиве. Второй аргумент — это загрузчик классов, который станет родителем этого нового загрузчика классов. В качестве этого аргумента мы передаем загрузчик класса, выполняющего приведенный выше код.

Классы, загруженные дочерним загрузчиком классов, могут получить доступ к классам, загруженным родительским загрузчиком классов.

person samitgaur    schedule 28.07.2010
comment
Это работает с одной модификацией в строке 2, потому что в моем случае я загружаю скомпилированный скрипт Groovy: вместо getClass().class.getClassLoader() я использую new GroovyClassLoader(). Спасибо. - person Tiago Fernandez; 28.07.2010

Вам нужно написать свой собственный загрузчик классов.

Эта ссылка на javadoc содержит пример того, как вы можете определить пользовательский.

person Alexander Pogrebnyak    schedule 28.07.2010
comment
Это работает, спасибо! Я оцениваю, будет ли это лучшим подходом в рамках моего проекта. - person Tiago Fernandez; 28.07.2010