2

我真的是 groovy 脚本的新手,但是按照一些教程,我尝试parseClass()使用GroovyClassLoader. 我写了一些片段,对我来说效果很好。问题是我不清楚 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。

4

1 回答 1

1

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

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

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

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

但是,深入研究主题会更好,因为动态类加载是高级 Java/Groovy 技术,它是链式类加载器的整个基础架构,因此最好参考有关它们的文档。

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

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

如何使用 URLClassLoader 加载 *.class 文件?

于 2014-02-13T11:51:45.740 回答