我在groovy中编写了一小段代码。我有2个方法1)generateAll
和其他2)validate
。我的想法是拦截对generateAll
的号召。首先验证输入,然后继续generateAll
。我不知道为什么
this.metaClass.getMetaMethod(name, args)
始终为validate
方法提供null。但是,如果我没有传递参数,它会找到该方法但后来因为传递的参数数量错误而中断。
class CreateAllScripts implements GroovyInterceptable {
void generateAll(String configName) {
//DO some stuff
}
def invokeMethod(String name, args) {
if (name == 'generateAll') {
//First validate the config
validate(args);
}
def method = this.metaClass.getMetaMethod(name, args)
method.invoke(this, args)
}
private void validate(String configName) {
println("Validating")
//perform some validation.
}
}
答案 0 :(得分:1)
问题在于如何将参数传递给validate
。应使用*
运算符:
class CreateAllScripts implements GroovyInterceptable {
void generateAll(String configName) {
System.out.println("generating: $configName")
}
def invokeMethod(String name, args) {
System.out.println("$name $args")
if (name == 'generateAll') {
validate(*args)
}
def method = this.metaClass.getMetaMethod(name, args)
method.invoke(this, args)
}
private void validate(String configName) {
System.out.println("validating: $configName")
}
}
new CreateAllScripts().generateAll('aaa')
如果只调用validate(args)
,则输出将为:
generateAll [aaa]
validate [[aaa]]
Exception thrown
您是否看到aaa
被包装在第二个列表中?这导致了问题。没有名称验证的方法接受集合。
现在,validate(*args)
提供以下输出:
generateAll [aaa]
validate [aaa]
validating: aaa
generating: aaa
哪个是对的。在动态方法上,调用args通常应与*
一起传递。