2015-11-27 16 views
0

我在Groovy中編寫了一小段代碼。我有2種方法1)generateAll和其他2)validate。這個想法是攔截電話generateAll。首先驗證輸入,然後繼續執行generateAll。我不知道爲什麼,但 this.metaClass.getMetaMethod(name, args)總是給我空爲validate方法。但是,如果我不傳遞參數,它會找到該方法,但後來由於傳遞的參數數量錯誤而中斷。Groovy的MethodIntercept

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

問題在於如何將參數傳遞給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  

這是正確的。在動態方法調用參數應該一般通過*