2017-05-30 70 views
0

我正在尋找一種方法來覆蓋xor在一個groovy腳本。覆蓋xor在groovy

我已經爲腳本創建了一個基類,其中定義了一個對象。該對象已有一個方法public Object xor(String var),其工作方式與myobject^"foo"類似。我想要的是訪問像myobject^foo這樣的方法,其中foo像普通字符串一樣處理。

+0

你能否提供一些更多的信息?我不確定你的意思是什麼,我想要的是訪問像myobject這樣的方法^ foo,其中foo像普通的String一樣處理。 – tylerwal

+0

我爲我的groovy腳本編寫了一個java基類。在那裏我定義了一個對象來提供對圖形數據庫的訪問。我想通過名稱訪問這些節點,例如'db^nodename'或'db^nodename^nodename2 ...'。我已經有的方法是'public Object xor(String var)',但是不幸的是我必須寫'db ^「nodename」'。在這種情況下, –

回答

0

@daggett我發現了失蹤處理的方法屬性:

public abstract class MyBaseScript extends Script implements GroovyObject { 
    protected class A { 
     public Object xor(String var) { 
      //do fancy stuff 
      return var; 
     } 
    } 

    protected A foo = new A();   

    //method which handles missing properties 
    public Object propertyMissing(String name) { 
     return name; 
    } 
} 

我該如何開始我的劇本:

Binding binding = new Binding(); 
// passing parameters 
binding.setVariable("arg0", arg0); 
binding.setVariable("args", arg1); 

// Compiler Config 
CompilerConfiguration cc = new CompilerConfiguration(); 
ImportCustomizer ic = new ImportCustomizer(); 
// add some imports for e.g. 
ic.addImports("java.awt.Color", "java.util.Calendar",...); 
cc.addCompilationCustomizers(ic); 
// set BaseClass 
cc.setScriptBaseClass("de.MyBaseScript"); 
// execute script 
GroovyClassLoader loader = new GroovyClassLoader(); 
shell = new GroovyShell(loader, binding, cc); 
Script gscript = shell.parse(groovyScriptAsAFile); 
Object o = gscript.run(); 
0

因爲我知道你想以某種方式做

(myobject^"foo") == (myobject^foo) 

所以,在你的腳本,你可以重新定義方法GetProperty(),所以在你的腳本訪問foo的屬性將返回「foo」的字符串..

class A{ 
    public Object xor(Object o){ 
     println "xor $o" 
     return o 
    } 
} 

public getProperty(String key){ 
    if(key in ['out'])return super.getProperty(key) //skip standard properties 
    return key 
} 

def myobject=new A() 
assert (myobject^foo) == (myobject^"foo") 

,但我看不出有什麼好處:)根據您的回答

+0

- 沒辦法。你只能做它只爲財產。在groovy'myobject.getProperty('foo')== myobject.'foo'== myobject.foo' – daggett

+0

這似乎有助於:)。但是我正在用java編寫我的對象(例如A)。所以['out']是我的對象具有的屬性列表(在元類中)? '公共類A延伸GroovyObjectSupport { 公共對象XOR(字符串VAR){ \t \t對象o = \t \t返回O; \t} \t \t @Override \t公共對象的getProperty(String屬性){ \t \t對象o = NULL; \t \t if((o = super.getProperty(property))== null) \t \t \t return property; \t \t return o; \t} }' 但我得到一個MissingPropertyException。什麼是['out']?我怎樣才能在java中調用它? –

+0

從哪裏打電話給你的對象?從groovy腳本?如果是'out'是一個用於'println'函數的標準'groovy.lang.Script'屬性。在我的情況下,我爲腳本重新定義'getProperty'而不是對象。只要檢查誰在拋出MissingPropertyException,你就會明白。 – daggett