错误记录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

Groovy闭包 Closure ( 闭包定义 | 闭包类型 | 查看编译后的字节码文件中的闭包类型变量 )

Groovy闭包 Closure ( 闭包中调用 Groovy 脚本中的方法 | owner 与 delegate 区别 | 闭包中调用对象中的方法 )

Groovy集合遍历 ( 使用集合的 find 方法查找集合元素 | 闭包中使用 == 作为查找匹配条件 | 闭包中使用 is 作为查找匹配条件 | 闭包使用 true 作为条件 | 代码示例 )

Groovy集合遍历 ( 使用集合的 find 方法查找集合元素 | 闭包中使用 == 作为查找匹配条件 | 闭包中使用 is 作为查找匹配条件 | 闭包使用 true 作为条件 | 代码示例 )(代

Groovy闭包 Closure ( 闭包类 Closure 简介 | thisownerdelegate 成员区别 | 静态闭包变量 | 闭包中定义闭包 )