Groovy CliBuilder:是否定义了任何方法?

时间:2018-08-08 07:55:07

标签: groovy command-line-interface

我是Groovy的新手。 关于CliBuilder中的代码的非常简单的问题。

http://docs.groovy-lang.org/latest/html/gapi/index.html?overview-summary.html

def cli = new CliBuilder(name:'ls')
cli.a('display all files')
cli.l('use a long listing format')
cli.t('sort by modification time')
def options = cli.parse(args)
assert options // would be null (false) on failure
assert options.arguments() == ['*.groovy']
assert options.a && options.l && options.t

CliBuilder类的行为就像知道我们要提前调用的任何方法一样。 Groovy的哪些功能可以支持它?

1 个答案:

答案 0 :(得分:1)

这称为Runtime metaprogramming

如果要使用“动态方法”创建自己的类,最简单的方法是实现GroovyInterceptable接口并将invokeMethod方法添加到类中。

class Interception implements GroovyInterceptable {

    def definedMethod() { }

    def invokeMethod(String name, Object args) {
        'invokedMethod'
    }
}

只要类InterceptioninvokeMethod被称为 ,则在实例上调用方法。请注意,对于类中实际定义的方法(例如definedMethod)也是如此

您可以使用metaClass这样调用实际方法

class Interception implements GroovyInterceptable {

    def definedMethod() { }

    def invokeMethod(String name, Object args) {
        if (name == "actualMethod") {
            return metaClass.invokeMethod(this, name, args)
        }
        return "invokedMethod: $name($args)"
    }

    def actualMethod() {
        return 'hello there'
    }
}

这里对actualMethod的调用仍然会经过invokeMethod,但是invokeMethod包含调用实际方法的逻辑。

还有其他一些方法(请参见顶部的链接)来完成类似的行为,但是我发现这是最简单的。

请注意,除非您添加TypeCheckingExtension来减轻这种情况,否则运行时元编程与@CompileStatic不兼容。

Run Example