文章目录
一、报错信息
二、解决方案
一、报错信息
在 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 之后 , 的执行效果 :