在Groovy中,invokeMethod
和methodMissing
方法之间的主要区别是什么?当一个方法应该用于另一个方法时,是否有明确的指导原则?
答案 0 :(得分:3)
何时使用: 始终使用methodMissing。
@FooBarUser。感谢您将我指向包含错误文档的页面,该页面很快就会更改。
仅在某些情况下,通常不会为每个方法调用调用invokeMethod。这也是为什么添加了methodMissing,为了让一个方法具有明确的角色,不像有时后退,有时候是前端方法invokeMethod
答案 1 :(得分:1)
Theres a post here
在Groovy为对未在类中定义的方法进行的调用抛出MissingMethodException之前,Groovy首先通过对象的methodMissing()方法路由调用。这使程序员有机会拦截对这些不存在的方法的调用,并为它们定义实现。
文档here:
从1.5开始,Groovy支持“methodMissing”的概念。这与invokeMethod的不同之处在于,只有在方法分派失败的情况下才会调用它。
1)由于方法/属性只在发送失败的情况下发生, 它们执行起来很昂贵
2)因为方法/ propertyMissing不拦截每个方法调用,如 invokeMethod使用一些元编程技巧可以提高效率
答案 2 :(得分:0)
invokeMethod()似乎在decorator pattern Groovy doc中使用了很多。例如:
class TracingDecorator {
private delegate
TracingDecorator(delegate) {
this.delegate = delegate
}
def invokeMethod(String name, args) {
println "Calling $name$args"
def before = System.currentTimeMillis()
def result = delegate.invokeMethod(name, args)
println "Got $result in ${System.currentTimeMillis()-before} ms"
result
}
}
话虽如此,def result = delegate.invokeMethod(name, args)
可以很容易地被更现代的Groovy成语def result = delegate."$name"(*args)
取代。