我正在尝试loadClass,它是在构建过程中编译并作为.class文件放置在类路径中的。为此我试过
GroovyClassLoader gos = new GroovyClassLoader();
gos.loadClass("className");这将成功地在java代码中加载类文件,但是它使用AppClassLoader来加载这个类文件,而不是GroovyClassLoader。
据我所知,GroovyClassLoader内部使用AppClassLoader查找它。但是有一个区别:
因为gos.parseClass(string)将给我们一个解析自GroovyClassLoader的类。
虽然在第二种情况下实例化类文件(ParseClass)给我们委托来设置代理,但是在第一种情况下(LoadClass),我们没有任何委托。
如何在执行loadClass后设置委托或通过GroovyClassLoader加载类文件的任何方式。
发布于 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对象,我们可以设置一个委托并运行脚本。
https://stackoverflow.com/questions/68224493
复制相似问题