首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >GroovyClassLoading机制

GroovyClassLoading机制
EN

Stack Overflow用户
提问于 2014-02-13 11:24:06
回答 1查看 379关注 0票数 2

我对groovy脚本非常陌生,但在一些教程之后,我尝试使用parseClass()GroovyClassLoader方法在java代码中动态加载一些groovy类。我写了一些片段,对我来说很好。问题是我不清楚groovy引擎在我的视图之外做了什么,以及这些脚本是如何编译的?

一个新的类会被复制并加载到jvm中吗?还是我的应用程序使用了一些缓存的源代码?

下面是我要解析的类:

代码语言:javascript
复制
  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()加载它,如下所示:

代码语言:javascript
复制
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.

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2014-02-13 11:51:45

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

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

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

在场景后面没有“缓存源”或类似的smth,您可以忘记,您的类是从哪里加载的。您还可以缓存已经编译的类,并将它们保存在某个地方,如[这里]所述。如果您需要经常加载同一个类,它将极大地提高性能。

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

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

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

.class文件?

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/21752809

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档