首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何使用GroovyClassLoader加载GroovyCompiled类或在loadClass情况下如何设置委托

如何使用GroovyClassLoader加载GroovyCompiled类或在loadClass情况下如何设置委托
EN

Stack Overflow用户
提问于 2021-07-02 11:34:51
回答 1查看 376关注 0票数 0

我正在尝试loadClass,它是在构建过程中编译并作为.class文件放置在类路径中的。为此我试过

代码语言:javascript
复制
GroovyClassLoader gos = new GroovyClassLoader();

gos.loadClass("className");

这将成功地在java代码中加载类文件,但是它使用AppClassLoader来加载这个类文件,而不是GroovyClassLoader。

据我所知,GroovyClassLoader内部使用AppClassLoader查找它。但是有一个区别:

因为gos.parseClass(string)将给我们一个解析自GroovyClassLoader的类。

虽然在第二种情况下实例化类文件(ParseClass)给我们委托来设置代理,但是在第一种情况下(LoadClass),我们没有任何委托。

如何在执行loadClass后设置委托或通过GroovyClassLoader加载类文件的任何方式。

负载级

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2021-07-09 15:00:23

Groovy编译groovy文件(HelloWorld.dsl),并将它们放入类路径中,创建同名的.class文件(HelloWorld.class)。默认情况下,编译后的类文件(打开字节码)具有与类文件同名的类(HelloWorld)。

这个类将从脚本中得到扩展。现在,如果您尝试使用gos.loadClass("HelloWorld").newInstance()加载这个类文件,它将为我们提供一个脚本对象,我们将无法将委托设置为一个脚本对象。而且,它也不会被转换成DelegatingScript。

要使您的编译类从DelegatingScript扩展,请将其添加到dsl文件@groovy.transform.BaseScript DelegatingScript delegatingScript的顶部。Groovy编译器将理解这一点,并使类文件从DelegatingScript (而不是前面的脚本)中得到扩展。

现在,当您尝试使用gos.loadClass("HelloWorld").newInstance()加载类时,它将给一个DelegatingScript对象而不是一个脚本对象。对于这个对象,我们可以设置委托并运行脚本。

若要使用委托(如果您使用的是parseClass ),我们需要将setScriptBaseClass作为DelegatingScript到compilerConfiguration。现在,如果您尝试gos.parseClass(dslText).newInstance(),它将直接给出一个DelegatingScript对象,我们可以设置一个委托并运行脚本。

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

https://stackoverflow.com/questions/68224493

复制
相关文章

相似问题

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