Groovy - возможно ли загрузить бинарный класс?

У меня есть приложение Java, которое использует несколько скриптов Groovy, скрипты кэшируются в памяти после компиляции Использование GroovyShell.parse(text) метод.

Можно ли скомпилировать эти сценарии только один раз и сохранить двоичные классы на диске / в базе данных? Следующий код будет хранить двоичные классы в /tmp;

    CompilerConfiguration compilerConfiguration=new CompilerConfiguration();
    compilerConfiguration.setTargetDirectory("/tmp/");
    GroovyShell shell=new GroovyShell(compilerConfiguration);
    shell.parse("println 'foo';","myScript1");
    shell.parse("println 'bar';","myScript2");

После запуска этого кода я вижу myScript1.class а также myScript2.class в /tmp/ каталог, но попытка использовать приведенный выше код для загрузки классов ПОСЛЕ перезапуска приложения (чтобы не было необходимости в перекомпиляции) завершается неудачно:

    CompilerConfiguration compilerConfiguration=new CompilerConfiguration();
    compilerConfiguration.setTargetDirectory("/tmp/");
    GroovyShell shell=new GroovyShell(compilerConfiguration);
    Class clazz=shell.getClassLoader().loadClass("myScript1");

Из исходного кода GroovyClassLoader я не вижу никакого способа загрузки бинарных классов, кроме defineClass(java.lang.String, byte[]) метод, который выдает следующее исключение при попытке загрузки классов:

Exception in thread "main" java.lang.ClassFormatError: Incompatible magic value 2901213189 in class file myScript1

Есть ли другой способ прямой загрузки скомпилированных классных классов?

1 ответ

Я понял это, просто предоставив URLClassLoader с тем же каталогом для конструктора GroovyShell работает как положено.

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