2017-05-30 4 views
0

Ich bin auf der Suche nach einer Möglichkeit, xor auf einem groovigen Skript zu überschreiben.überschreiben xor in groovy

Ich habe eine Basisklasse für mein Skript erstellt, wo ein Objekt definiert ist. Dieses Objekt hat bereits eine Methode public Object xor(String var), die funktioniert wie myobject^"foo". Was ich will, ist Weg, auf diese Methode wie myobject^foo zuzugreifen, wo foo wie ein normaler String behandelt.

+0

Können Sie einige weitere Informationen zur Verfügung stellen? Ich bin mir nicht sicher, was du mit 'Was ich will ist ein Weg, um auf diese Methode wie myobject^foo, wo foo behandelt wie eine normale String. ' – tylerwal

+0

Ich habe eine Basisklasse in Java für meine groovigen Skripte geschrieben. Dort habe ich ein Objekt definiert, das Zugriff auf eine Graphdatenbank bietet. Ich möchte auf diese Knoten namentlich zugreifen, zum Beispiel 'db^nodename' oder' db^nodename^nodename2 ... '. Die Methode, die ich bereits habe, ist 'public Object xor (String var)' was funktioniert, aber leider muss ich 'db ^" nodename "' schreiben. –

Antwort

0

auf Ihre Antwort Basierend @daggett ich eine Methode gefunden, die fehlende Griffe Eigenschaften:

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; 
    } 
} 

Wie kann ich meine Skripte starten:

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

wie ich verstehe Sie irgendwie, dass

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

so tun wollen, in Ihrem Skript können Sie Methode getProperty() so in Ihrem Skriptzugriff neu zu definieren Eigenschaft foo "foo" String zurück ..

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

, aber ich sehe keine Vorteile :)

+0

in diesem Fall - auf keinen Fall. Sie können es nur für Eigentum tun. in groovy 'myobject.getProperty ('foo') == myobject.'foo '== myobject.foo' – daggett

+0

Dies scheint zu helfen :). Aber ich schreibe mein Objekt (für Ihr Beispiel A) in Java. Also ['out'] ist die Liste der Eigenschaften (in der Metaklasse), die mein Objekt hat? 'public class A erstreckt GroovyObjectSupport { public Object xor (String var) { \t \t Object o = \t \t Rückkehr o; \t} \t \t @Override \t public Object getProperty (String-Eigenschaft) { \t \t Object o = null; \t \t if ((0 = super.getProperty (property)) == null) \t \t \t Rückgabeeigenschaft; \t \t Rückgabe o; \t} } ' Aber ich bekomme eine MissingPropertyException. Was ist [out]? Wie kann ich es in Java nennen? –

+0

woher rufst du dein Objekt an? aus groovigem Drehbuch? wenn ja, ist out eine Standard-Eigenschaft 'groovy.lang.Script', die für die 'println'-Funktion verwendet wird. und in meinem Fall definiere ich 'getProperty' für das Skript und nicht für das Objekt. Überprüfen Sie einfach, wer MissingPropertyException wirft und Sie werden es verstehen. – daggett