错误记录Groovy 闭包使用报错 ( 闭包中不能直接使用外部对象的方法 | 需要先设置 delegate 代理 )
Posted 韩曙亮
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了错误记录Groovy 闭包使用报错 ( 闭包中不能直接使用外部对象的方法 | 需要先设置 delegate 代理 )相关的知识,希望对你有一定的参考价值。
一、报错信息
在 Groovy 中的 Closure 闭包中 , 直接调用外部对象的方法 , 会报错 ;
class Test
def fun()
println "fun"
def closure =
fun()
closure()
报错信息 :
"D:\\Program Files\\Java\\jdk1.8.0_221\\bin\\java.exe" "-Dtools.jar=D:\\Program Files\\Java\\jdk1.8.0_221\\lib\\tools.jar" -Dgroovy.home=C:\\Users\\octop\\.gradle\\caches\\modules-2\\files-2.1\\org.codehaus.groovy\\groovy-all\\2.3.11\\f6b34997d04c1538ce451d3955298f46fdb4dbd4 "-javaagent:Y:\\001_DevelopTools\\006_IntelliJ_IDEA_Community\\IntelliJ IDEA Community Edition 2019.3.1\\lib\\idea_rt.jar=14846:Y:\\001_DevelopTools\\006_IntelliJ_IDEA_Community\\IntelliJ IDEA Community Edition 2019.3.1\\bin" -Dfile.encoding=UTF-8 -classpath C:\\Users\\octop\\.gradle\\caches\\modules-2\\files-2.1\\org.codehaus.groovy\\groovy-all\\2.3.11\\f6b34997d04c1538ce451d3955298f46fdb4dbd4\\groovy-all-2.3.11.jar org.codehaus.groovy.tools.GroovyStarter --main groovy.ui.GroovyMain --classpath .;Y:\\002_WorkSpace\\003_IDEA\\Groovy_Demo\\build\\classes\\groovy\\main;C:\\Users\\octop\\.gradle\\caches\\modules-2\\files-2.1\\org.codehaus.groovy\\groovy-all\\2.3.11\\f6b34997d04c1538ce451d3955298f46fdb4dbd4\\groovy-all-2.3.11.jar --encoding=UTF-8 Y:\\002_WorkSpace\\003_IDEA\\Groovy_Demo\\src\\main\\groovy\\Groovy.groovy
Caught: groovy.lang.MissingMethodException: No signature of method: Groovy.fun() is applicable for argument types: () values: []
Possible solutions: run(), run(), run(java.io.File, [Ljava.lang.String;), find(), find(groovy.lang.Closure), any()
groovy.lang.MissingMethodException: No signature of method: Groovy.fun() is applicable for argument types: () values: []
Possible solutions: run(), run(), run(java.io.File, [Ljava.lang.String;), find(), find(groovy.lang.Closure), any()
at Groovy$_run_closure1.doCall(Groovy.groovy:10)
at Groovy$_run_closure1.doCall(Groovy.groovy)
at Groovy.run(Groovy.groovy:14)
Process finished with exit code 1
二、解决方案
在 Closure 闭包中 , 如果要调用外部对象的方法 , 需要先设置 Closure 闭包对象的 delegate 成员为指定的外部对象 ;
class Test
def fun()
println "fun"
// 闭包中不能直接调用 Test 对象中的方法
// 此时可以通过改变闭包代理进行调用
def closure =
fun()
closure.delegate = new Test()
closure()
设置完 Closure 闭包对象的 delegate 之后 , 的执行效果 :
以上是关于错误记录Groovy 闭包使用报错 ( 闭包中不能直接使用外部对象的方法 | 需要先设置 delegate 代理 )的主要内容,如果未能解决你的问题,请参考以下文章
Groovy闭包 Closure ( 闭包定义 | 闭包类型 | 查看编译后的字节码文件中的闭包类型变量 )
Groovy闭包 Closure ( 闭包中调用 Groovy 脚本中的方法 | owner 与 delegate 区别 | 闭包中调用对象中的方法 )
Groovy集合遍历 ( 使用集合的 find 方法查找集合元素 | 闭包中使用 == 作为查找匹配条件 | 闭包中使用 is 作为查找匹配条件 | 闭包使用 true 作为条件 | 代码示例 )
Groovy集合遍历 ( 使用集合的 find 方法查找集合元素 | 闭包中使用 == 作为查找匹配条件 | 闭包中使用 is 作为查找匹配条件 | 闭包使用 true 作为条件 | 代码示例 )(代
Groovy闭包 Closure ( 闭包类 Closure 简介 | thisownerdelegate 成员区别 | 静态闭包变量 | 闭包中定义闭包 )