GroovyClassLoading机制(GroovyClassLoading Mechanism)

2019-09-29 03:15发布

我真的新手Groovy脚本,但以下一些教程中,我试图使用动态加载我的Java代码中的一些常规类parseClass()的方法GroovyClassLoader 。 我写了一些片段,并为我工作得很好。 问题是,我不搞清楚什么是常规发动机做超出了我的看法和这些脚本是如何编制?
是否一个新的类被creted并加载到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();

}


任何澄清greatelly理解。

BR。

Answer 1:

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

有一个简单的教程[ 这里 ],显示如何从字符串加载类。

在简单的情况下,可以加载类,并保持它的Class对象,用它来动态地创建对象。 对于现场访问或方法invokation你可以依靠Groovy的动态特性。

没有“缓存源”或不服这样的场景背后,你可以忘记,从那里你的类加载。 您也可以缓存类,即已经进行了编译,并将其保存的地方,如[描述这里 。 这将极大地提高性能,如果你需要经常加载同一个类。

但它会更好,向下挖掘的话题,因为动态类加载高级Java / Groovy的技术,它的链接的类加载器的整个基础设施,所以最好参考关于他们的资料。

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

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

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



文章来源: GroovyClassLoading Mechanism