在 groovy 中覆盖异或

overwrite xor in groovy

我正在寻找一种方法来覆盖 groovy 脚本上的 xor。

我已经为我的脚本创建了一个基础 class,其中定义了一个对象。该对象已经有一个方法 public Object xor(String var),其工作方式类似于 myobject^"foo"。我想要的是像 myobject^foo 这样访问此方法的方法,其中 foo 像普通字符串一样处理。

据我所知,您想以某种方式做到这一点

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

因此,在您的脚本中您可以重新定义方法 getProperty() 因此在您的脚本中访问 foo 属性 将 return "foo" string..

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")

但我没有看到任何好处:)

根据@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();