Загрузка классов, отсутствующих в пути к классам
Допустим, я скомпилировал скрипт Groovy с помощью Groovyc, который сгенерировал один или несколько файлов.class в файловой системе. Из приложения Java, как мне динамически добавить эти классы в путь к классам, чтобы загрузить их и вызвать их методы? Цель состоит в том, чтобы предварительно скомпилировать скрипты Groovy и сохранить их в базе данных, чтобы можно было выполнить оценку на основе скомпилированных версий скриптов.
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 в массиве. Второй аргумент - загрузчик классов, который станет родителем этого нового загрузчика классов. В качестве этого аргумента мы передаем загрузчик классов класса, выполняющего приведенный выше код.
Классы, загруженные дочерним загрузчиком классов, могут получить доступ к классам, загруженным родительским загрузчиком классов.
Вам нужно написать свой собственный загрузчик классов.
Эта ссылка на Javadoc содержит пример того, как вы можете определить пользовательскую ссылку.