invokeMethod和methodMissing有什么区别?

时间:2013-10-07 08:43:42

标签: groovy

在Groovy中,invokeMethodmethodMissing方法之间的主要区别是什么?当一个方法应该用于另一个方法时,是否有明确的指导原则?

3 个答案:

答案 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)取代。