Загрузка классных классов с конфликтующими именами
Я использую GroovyScriptEngine
внутри моего Java-приложения для динамической загрузки кода из разных источников. Допустим, у меня есть две папки sources_A\
а также sources_B\
,
GroovyScriptEngine engine = new GroovyScriptEngine(new String[]{
"sources_A", "sources_B"
});
В каждой папке у меня есть Groovy-пакеты и классы, которые я хочу создавать произвольно во время выполнения.
Проблема: Некоторые из этих классов имеют одинаковое (полное) имя в обеих папках.
Так что, когда я бегу, возникает двусмысленность:
engine.loadScriptByName("some.package.SomeClass").newInstance()
Конечно, я мог бы создать два разных движка:
GroovyScriptEngine engine_A = new GroovyScriptEngine(new String[]{"sources_A"});
GroovyScriptEngine engine_B = new GroovyScriptEngine(new String[]{"sources_B"});
Но затем я сталкиваюсь с проблемами, когда два объекта, созданные на основе этих двух разных механизмов, должны взаимодействовать друг с другом:
object_from_A.someMethod(object_from_B);
Ошибка: несоответствие типа аргумента в строке ** в методе foo в файле bar.groovy
(Само собой разумеется, что нет никакого несоответствия типов: объект имеет правильный тип, но не распознается из-за другого движка)
Короче говоря, у вас есть решение:
- Одно-движковое решение с определенным способом устранения неоднозначности, какая исходная папка используется?
- Двухмоторное решение с каким-то способом, чтобы объекты из двух разных движков работали вместе?
1 ответ
Загрузчик классов Java (и Groovy) идентифицирует класс по его полному имени и может загрузить его только один раз. Итак, нет, вы не можете загрузить 2 класса с одинаковыми именами (будет загружен только один).