Я успешно могу скомпилировать Groovy на Java во время выполнения, сохранить его в базе данных и извлечь. Я не могу скомпилировать класс Groovy, если он имеет внутренние классы или внутреннее перечисление. Кто-нибудь успешно скомпилировал такой код Groovy, включил внутренние классы/перечисления и смог вытащить скрипт по имени класса?
Например, я хочу загрузить показанный ниже сценарий «Тест», который содержит внутренние классы, и запустить сценарий во время выполнения.
Код компилятора:
public byte[] compileGroovyScript(final String className, final String script) {
byte[] compiledScriptBytes = null;
CompilationUnit compileUnit = new CompilationUnit();
compileUnit.addSource(className, script);
compileUnit.compile(Phases.CLASS_GENERATION);
for (Object compileClass : compileUnit.getClasses()) {
GroovyClass groovyClass = (GroovyClass) compileClass;
compiledScriptBytes = groovyClass.getBytes();
}
return compiledScriptBytes;
}
Код для извлечения скрипта:
public Class getGroovyScript(final String className, final byte[] script) {
Class clazz = null;
try (GroovyClassLoader classLoader = new GroovyClassLoader(this.getClass().getClassLoader())) {
clazz = classLoader.defineClass(className, script);
} catch (IOException e) {
} catch (Exception e) {
}
return clazz;
}
Код для запуска скрипта:
Class groovyClass = app.getGroovyScript(className, compiledScript);
TestScript script = (TestScript) groovyClass.newInstance();
System.out.println(script.getMessage());
Крутой скрипт:
import com.groovy.groovy.TestScript
class Test implements TestScript {
String getMessage() {
[1..10].each(){
println it
}
return "Jello"
}
}
compiledScriptBytes = groovyClass.getBytes();
Я не знаю, так ли это, но это похоже на потенциальную ошибку. - person airborn   schedule 16.04.2014