gpt4 book ai didi

java - Groovy类加载机制

转载 作者:太空宇宙 更新时间:2023-11-04 07:03:35 27 4
gpt4 key购买 nike

我确实是 groovy 脚本编写的新手,但在学习了一些教程之后,我尝试使用 GroovyClassLoaderparseClass() 方法在我的 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。

最佳答案

加载类后,它会出现在类加载器中,并且可以像任何其他类一样进行访问。

有一个简单的教程[ here ],展示了如何从字符串加载类。

在最简单的情况下,您可以加载类,并保存它的 Class 对象,使用它动态创建对象。对于字段访问或方法调用,您可以依靠 Groovy 的动态特性。

幕后没有“缓存源”或类似的东西,您可能会忘记您的类是从哪里加载的。您还可以缓存已编译的类,并将它们保存在某处,如所述[here] ]。如果您需要经常加载相同的类,它将极大地提高性能。

但是深入主题会更好,因为动态类加载是先进的 Java/Groovy 技术,它是链式类加载器的整个基础结构,因此最好引用有关它们的文档。

下面的链接可能会有所帮助。

http://javarevisited.blogspot.ru/2012/12/how-classloader-works-in-java.html

How to use URLClassLoader to load a *.class file?

关于java - Groovy类加载机制,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21752809/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com