我是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的哪些功能可以支持它?
答案 0 :(得分:1)
如果要使用“动态方法”创建自己的类,最简单的方法是实现GroovyInterceptable
接口并将invokeMethod
方法添加到类中。
class Interception implements GroovyInterceptable {
def definedMethod() { }
def invokeMethod(String name, Object args) {
'invokedMethod'
}
}
只要类Interception
,invokeMethod
被称为 ,则在实例上调用方法。请注意,对于类中实际定义的方法(例如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
不兼容。