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
работает как положено.