【问题标题】:overwrite xor in groovy在 groovy 中覆盖异或
【发布时间】:2017-10-30 17:09:40
【问题描述】:

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

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

【问题讨论】:

  • 您能提供更多信息吗?我不确定您所说的What I want is way to access this method like myobject^foo where foo handled like a normal String. 是什么意思?
  • 我为我的 groovy 脚本用 java 编写了一个基类。在那里我定义了一个提供对图形数据库的访问的对象。我想按名称访问这些节点,例如 db^nodenamedb^nodename^nodename2...。我已经拥有的方法是public Object xor(String var),它有效,但不幸的是我必须写db^"nodename"

标签: methods groovy overwrite


【解决方案1】:

据我了解,您想以某种方式做到这一点

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

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

【讨论】:

  • 在这种情况下 - 没办法。你只能为财产做这件事。在常规myobject.getProperty('foo') == myobject.'foo' == myobject.foo
  • 这似乎有帮助:)。但是我正在用 java 编写我的对象(对于您的示例 A)。那么 ['out'] 是我的对象具有的属性列表(在元类中)? public class A extends GroovyObjectSupport { public Object xor(String var) { Object o = return o; } @Override public Object getProperty(String property){ Object o = null; if((o = super.getProperty(property) ) == null) return property; return o; } } 但我得到了一个 MissingPropertyException。什么是['out']?我如何在java中调用它?
  • 你从哪里调用你的对象?来自 groovy 脚本?如果是,out 是用于 println 函数的标准 groovy.lang.Script 属性。就我而言,我正在为脚本而不是对象重新定义getProperty。只需检查谁在抛出 MissingPropertyException,您就会明白。
【解决方案2】:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-11-17
    • 2013-04-18
    • 2015-04-30
    • 1970-01-01
    • 2012-01-28
    • 1970-01-01
    • 2010-12-28
    • 2015-08-28
    相关资源
    最近更新 更多