Загрузка взаимозависимых классных классов в Java

1

Я пытаюсь выяснить, как загрузить два со-зависимых скрипта Groovy в java во время выполнения. Если у меня есть два строчных скрипта:

A.groovy

import B

class A {
  A() {
    B b = new B()
  }
}

B.groovy

import A

class B {
  B() {
    A a = new A()
  }
}

Я хотел бы загрузить их как классы java, но когда я запускаю:

ClassLoader parent = getClass().getClassLoader();
GroovyClassLoader loader = new GroovyClassLoader(parent);
loader.parseClass(new File("A.groovy"));

Я получаю сообщение об ошибке:

org.codehaus.groovy.control.MultipleCompilationErrorsException: startup failed:
A.groovy: 1: unable to resolve class B
@ line 1, column 1.
import B

Я, конечно, понимаю причину ошибки, но есть ли способ загрузить эти классы во время выполнения, несмотря на их совместную зависимость? Благодарю!

Теги:
groovy

1 ответ

1
Лучший ответ

GroovyClassLoader должен быть включен, чтобы найти B.groovy в пути к классам. Обычно это означает, что вы изменяете путь к классу вашего приложения, чтобы включить корень скриптов. Поскольку здесь нет пакета для скриптов, и поскольку вы используете новый файл ("A.groovy"), я бы предположил, что он находится здесь в текущем каталоге.

Если вы не хотите изменять путь к классу приложения, вы также можете вызвать addURL, чтобы добавить путь, содержащий скрипты.

Еще одна вещь, о которой стоит упомянуть... parseClass всегда будет создавать новый анализируемый класс. Вместо этого вы можете попробовать стандартный вызов loadClass, чтобы избежать компиляции файла несколько раз. Но, конечно, это работает только после того, как вы исправили поиск GroovyClassLoader, потому что, используя loadClass, GroovyClassLoader также должен искать A.groovy таким же образом, что он должен искать B.groovy

  • 0
    Круто, это сработало, спасибо. Я добавил папку в classpath, а затем просто вызвал loadClass («A»).

Ещё вопросы

Сообщество Overcoder
Наверх
Меню