我对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();
}I用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.
发布于 2014-02-13 11:51:45
加载类之后,它会出现在类加载器中,并且可以像任何其他类一样被访问。
有一个简单的教程[这里],它展示了如何从字符串加载类。
在最简单的情况下,您可以加载类,并保存它的class对象,使用它动态创建对象。对于字段访问或方法调用,您可以依赖Groovy的动态特性。
在场景后面没有“缓存源”或类似的smth,您可以忘记,您的类是从哪里加载的。您还可以缓存已经编译的类,并将它们保存在某个地方,如[这里]所述。如果您需要经常加载同一个类,它将极大地提高性能。
但是,深入研究主题会更好,因为动态类加载是先进的Java/Groovy技术,它是链接类加载器的整个基础结构,因此最好参考有关它们的文档。
下面的链接可能会有帮助。
http://javarevisited.blogspot.ru/2012/12/how-classloader-works-in-java.html
https://stackoverflow.com/questions/21752809
复制相似问题