Загрузка классных классов с конфликтующими именами

Я использую 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 класса с одинаковыми именами (будет загружен только один).

Другие вопросы по тегам