我真的是groovy脚本的新手,但是在一些教程之后,我尝试使用parseClass()
GroovyClassLoader
方法在我的java代码中动态加载一些groovy类。
我写了一些片段,它对我来说很好。问题是我不清楚我的观点以外的groovy引擎是什么以及这些脚本是如何编译的?
是否有新的类被压缩并加载到jvm中?或者我的应用程序是否使用了一些缓存源?
这是我要解析的课程:
private static class MyScript {
@Override
public String toString()
{
StringBuilder builder = new StringBuilder();
builder.append("public class SomeClass\n");
builder.append("{\n");
builder.append("Some code...").append("\n");
builder.append("}\n");
return builder.toString();
}
我用build()
加载它,如下所示:
private Class MyGroovyBuilder {
private Script script = new Script();
public String build() throws TemplateCompilationException
//
String groovyText = script.toString();
//
CompilerConfiguration config = new CompilerConfiguration();
//
byte[] bytes;
try
{
bytes = groovyText.getBytes(config.getSourceEncoding());
}
catch (UnsupportedEncodingException e)
{
throw new TemplateCompilationException(e, groovyText);
}
//
InputStream in = new ByteArrayInputStream(bytes);
GroovyCodeSource gcs = new GroovyCodeSource(in, "SomeName", "/groovy/shell");
GroovyClassLoader loader = new
GroovyClassLoader(Thread.currentThread().getContextClassLoader(), config);
Class<?> scriptClass;
try
{
scriptClass = loader.parseClass(gcs, false);
}
catch (CompilationFailedException e)
{
throw new GroovyCompilationException(e, "SomeName", groovyText);
}
catch (ClassFormatError e)
{
throw new GroovyCompilationException(e, "SomeName", groovyText);
}
return scriptClass.getName();
}
任何澄清都非常感谢。
BR。
答案 0 :(得分:1)
加载类后,它出现在类加载器中,可以像任何其他类一样进行访问。
有一个简单的教程[here],它展示了如何从字符串加载类。
在最简单的情况下,您可以加载类,并保存它的Class对象,使用它来动态创建对象。对于字段访问或方法调用,您可以依赖Groovy动态特性。
在场景后面没有“缓存的源”或类似的东西,你可以忘记,从你的类加载的地方。您还可以缓存已编译的类,并将它们保存在某处,如[here]所述。如果您需要经常加载相同的类,它将大大提高性能。
但是在主题中挖掘会更好,因为动态类加载是高级Java / Groovy技术,它是链式类加载器的整个基础结构,因此最好引用它们的文档。
以下链接可能会有所帮助。
http://javarevisited.blogspot.ru/2012/12/how-classloader-works-in-java.html