Ich bin in der Lage, Groovy in Java zur Laufzeit zu kompilieren und in einer Datenbank zu speichern und herauszuziehen. Ich kann eine Groovy-Klasse nicht kompilieren, wenn sie innere Klassen oder eine innere Enum hat. Hat jemand erfolgreich Groovy-Code wie diesen kompiliert und interne Klassen/Enums enthalten und das Skript nach Klassennamen ziehen können?Kompiliere Groovy-Klasse zur Laufzeit in Java
Zum Beispiel möchte ich das "Test" -Skript laden, das innere Klassen enthält und das Skript zur Laufzeit ausführen.
Compiler Code:
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;
}
-Code ziehen Skript aus:
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;
}
Code, um das Skript auszuführen:
Class groovyClass = app.getGroovyScript(className, compiledScript);
TestScript script = (TestScript) groovyClass.newInstance();
System.out.println(script.getMessage());
Groovy Skript:
import com.groovy.groovy.TestScript
class Test implements TestScript {
String getMessage() {
[1..10].each(){
println it
}
return "Jello"
}
}
Sie iterieren über Klassen von compilationUnit, aber Sie geben nur Bytes aus der letzten Klasse 'compiledScriptBytes = groovyClass.getBytes();' Ich weiß nicht, ob das der Fall ist, aber das sieht wie ein potenzieller Fehler aus. – airborn
Nun, ich habe versucht, über alle Klassen zu iterieren und sie in einem Byte zu speichern [], aber das hat nicht funktioniert, als ich die Groovy-Klasse bekommen und sie auf meine Java-Schnittstelle übertragen habe. – ColinMc