Sono riuscito a compilare correttamente Groovy in Java in fase di esecuzione e archiviarlo in un database ed estrarlo. Non riesco a compilare una classe Groovy se ha classi interne o enum interiori. Qualcuno ha compilato con successo il codice Groovy in questo modo e ha incluso classi interne/enumerazione ed è in grado di estrarre lo script in base al nome della classe?Compilazione classe Groovy in fase di esecuzione in Java
Ad esempio, voglio caricare lo script "Test" mostrato di seguito che contiene le classi interne ed eseguire lo script in fase di esecuzione. Codice
Compiler:
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;
}
codice per tirare fuori copione:
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;
}
codice per eseguire lo script:
Class groovyClass = app.getGroovyScript(className, compiledScript);
TestScript script = (TestScript) groovyClass.newInstance();
System.out.println(script.getMessage());
lo script Groovy:
import com.groovy.groovy.TestScript
class Test implements TestScript {
String getMessage() {
[1..10].each(){
println it
}
return "Jello"
}
}
di eseguire iterazioni su classi da compilationUnit, ma Tu ritorno byte solo l'ultima classe 'compiledScriptBytes = groovyClass.getBytes();' Non so se questo è il caso, ma questo sembra un potenziale bug. – airborn
Beh, ho provato a ripetere tutte le classi e memorizzarle in un byte [] ma non ha funzionato quando ho ottenuto la classe groovy e l'ho lanciata nell'interfaccia Java. – ColinMc