मैं रनटाइम पर जावा में ग्रोवी को संकलित करने में सक्षम हूं और इसे डेटाबेस में संग्रहीत करता हूं और इसे खींचता हूं। मैं ग्रोवी क्लास को संकलित नहीं कर सकता अगर इसमें आंतरिक कक्षाएं या आंतरिक enum है। क्या किसी ने सफलतापूर्वक ग्रोवी कोड को संकलित किया है और इसमें आंतरिक कक्षाएं/enums शामिल हैं और स्क्रिप्ट को कक्षा नाम से खींचने में सक्षम हैं?जावा में रनटाइम पर ग्रोवी क्लास संकलित करें
उदाहरण के लिए, मैं नीचे दिखाया गया "टेस्ट" स्क्रिप्ट लोड करना चाहता हूं जिसमें आंतरिक कक्षाएं हैं और रन टाइम पर स्क्रिप्ट चलाएं।
संकलक कोड:
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"
}
}
स्क्रिप्ट चलाने के लिए
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;
}
कोड:
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;
}
कोड स्क्रिप्ट बाहर निकलने के लिए
आप संकलन से वर्गों पर पुनरावृत्ति करते हैं, लेकिन आप अंतिम श्रेणी 'compiledScriptBytes = groovyClass.getBytes() से केवल बाइट्स लौटते हैं;' मुझे नहीं पता कि यह मामला है, लेकिन यह एक संभावित बग की तरह दिखता है। – airborn
वैसे मैंने सभी कक्षाओं में पुनरावृत्ति की कोशिश की और उन्हें एक बाइट [] में संग्रहित करने की कोशिश की [लेकिन यह ग्रोवी क्लास प्राप्त करने और इसे मेरे जावा इंटरफेस में कास्टिंग करते समय काम नहीं करता था। – ColinMc