Udało mi się skompilować Groovy w Javie w czasie wykonywania i zapisać ją w bazie danych i wyciągnąć. Nie mogę skompilować klasy Groovy, jeśli ma ona wewnętrzne klasy lub wewnętrzne wyliczenie. Czy ktokolwiek z powodzeniem skompilował taki kod Groovy i uwzględnił wewnętrzne klasy/wyliczenia i był w stanie wyciągnąć skrypt przez nazwę klasy?Skompiluj klasę Groovy w środowisku wykonawczym w języku Java
Na przykład chcę załadować poniższy skrypt "Test", który zawiera klasy wewnętrzne i uruchomić skrypt w czasie wykonywania. Kod
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;
}
Kod skryptu ciągnąć się:
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;
}
kod aby uruchomić skrypt:
Class groovyClass = app.getGroovyScript(className, compiledScript);
TestScript script = (TestScript) groovyClass.newInstance();
System.out.println(script.getMessage());
Groovy skrypt:
import com.groovy.groovy.TestScript
class Test implements TestScript {
String getMessage() {
[1..10].each(){
println it
}
return "Jello"
}
}
Powtarzasz klasy z kompilacjiUnit, ale zwracasz tylko bajty z ostatniej klasy 'compiledScriptBytes = groovyClass.getBytes();' Nie wiem, czy tak jest, ale wygląda na potencjalny błąd. – airborn
Próbowałem iterować we wszystkich klasach i przechowywać je w jednym bajcie [], ale to nie zadziałało, gdy otrzymałem klasę groovy i przerzuciłem ją do mojego interfejsu Java. – ColinMc