作为测试Gradle插件的一部分,我想找出一个groovy方法:project.exec {...}.这是为了确认它正在进行正确的命令行调用.我正在尝试使用元编程:
Project proj = ProjectBuilder.builder().build()
proj.metaClass.exec = { Closure obj ->
println 'MOCK EXEC'
}
proj.exec {
executable 'echo'
args 'PROJECT EXEC'
}
// prints 'PROJECT EXEC' instead of the 'MOCK EXEC' I expected
Run Code Online (Sandbox Code Playgroud)
令人好奇的是,如果我将两种exec方法重命名为othername,那么它可以正常工作:
Project proj = ProjectBuilder.builder().build()
proj.metaClass.othername = { Closure obj ->
println 'MOCK EXEC'
}
proj.othername {
executable 'echo'
args 'PROJECT EXEC'
}
// prints 'MOCK EXEC' as expected
Run Code Online (Sandbox Code Playgroud)
我试图找出为什么现有project.exec方法导致元编程失败以及是否有解决方法.请注意,这Project是一个接口,但我正在嘲笑一个特定的类型实例DefaultProject.
用于删除单个方法的元编程方法来自这个答案:https: …
在Groovy中有没有办法找出被调用方法的名称?
def myMethod() {
println "This method is called method " + methodName
}
Run Code Online (Sandbox Code Playgroud)
这与鸭子打字相结合将允许非常简洁(并且可能难以阅读)的代码.