2017-04-21 26 views
2

我對groovy很新。我正在嘗試將一些業務規則從java類以dSL格式傳遞給groovy。 Java類正在從外部來源讀取它。 Groovy類具有使用構建器讀取此DSL的實現。我如何將這些規則傳遞給groovy方法?從java關閉傳遞到groovy

這一點,我的Groovy類:

def ruleSet=[:]; 
    def displaySet=[:]; 
    def when(String c1) { 
     ['and': { String c2 -> 
      ['then': { String result -> 
       ['display':{String status -> 
       constructRule(c1,c2,result,status) 
       }] 
     }] 
    }] 
} 

def make(closure){ 


    when 'a=b' and 'c=d' then 'aaaa' display 'bbbb' 
    when "a1=b1" and "c1=d1" then "c1c1c1" display "d1d1d1" 
    println ruleSet 
    println displaySet 
} 

和測試Java類有這樣的:

Class scriptClass = new GroovyClassLoader().parseClass(new File("filename.groovy")) ; 
     GroovyObject groovyObj = (GroovyObject) scriptClass.newInstance(); 

     groovyObj.invokeMethod("make", new Object[] {????}); 
+0

你嘗試傳遞一個lambda來常規,看看會發生什麼? –

回答

0

一個Groovy閉包實際上是groovy.lang.Closure類型的對象。目前還不清楚make方法的closure參數是如何處理的,因爲您在方法中沒有以任何方式使用它。

例如,您可以創建一個通過創建像這樣一個MethodClosure子閉幕呼籲類中的方法閉包:

MethodClosure methodCall = new MethodClosure(someObject, "methodName"); 

閉包,做任何你想要的可以這樣用Java來創建:

打印出來的消息或其他任何

public class FooClosure extends Closure { 
    public FooClosure(Object owner, Object thisObject) { 
      super(owner, thisObject); 
      parameterTypes = new Class[1]; 
      parameterTypes[0] = String.class; 
      maximumNumberOfParameters = 1; 
    } 


    public java.lang.Object doCall(String message) { 
     System.out.println(message); 
     return Closure.DONE; 
    } 
} 
+0

我想將這個dsl​​從java代碼傳遞到groovy類,所以它可以被解析並存儲在規則集和結果集中。當'a = b'和'c = d'時,那麼當「a1 = b1」和「c1 = d1」時,'aaaa'顯示'bbbb' ,則「c1c1c1」顯示「d1d1d1」 – user2060910