Groovy脚本方法内访问字段异常:为何返回script类而非字段值?
Groovy脚本方法中访问自定义字段的问题解决
问题场景
我是Groovy新手,若问题较为基础还请见谅。现有两个文件Main.groovy和script.groovy:
Main.groovy代码:
package org.example static void main(String[] args) { def script = new GroovyShell().parse(new File('scripts/script.groovy')) println script.script println script.rScript() }
script.groovy代码:
@groovy.transform.Field String script = 'heredd' String rScript() { return "${script}" }
运行Main.groovy后输出:
heredd class script
直接从Script对象获取script属性能正常返回字段值,但在脚本内的rScript()方法中访问时,script被解析为Groovy内置的Script类,而非自定义字段。
解决方案
有两种可行的修改方式:
方式一:用this明确指定实例字段
修改script.groovy的rScript()方法,通过this.script明确引用自定义字段,避免和内置的script属性混淆:
@groovy.transform.Field String script = 'heredd' String rScript() { return "${this.script}" }
方式二:重命名字段避免冲突
把自定义字段名改成和Script类不冲突的名称(比如myScript),消除歧义:
@groovy.transform.Field String myScript = 'heredd' String rScript() { return "${myScript}" }
同时调整Main.groovy中的输出代码:
package org.example static void main(String[] args) { def script = new GroovyShell().parse(new File('scripts/script.groovy')) println script.myScript println script.rScript() }
原因说明
Groovy脚本编译后会生成继承自groovy.lang.Script的类,该类内部有一个隐含的script属性(指向脚本实例自身)。在方法内部直接使用script时,会优先解析这个内置属性,而非我们用@Field定义的自定义字段。通过this指定或重命名字段,就能避免这种命名冲突。
内容的提问来源于stack exchange,提问作者Etheilred
相关产品推荐
相关产品推荐

