MethodIntercept与groovy

时间:2015-11-27 06:25:34

标签: groovy

我在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.
   }
}

1 个答案:

答案 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通常应与*一起传递。