2016-08-04 16 views
0

Können Sie erklären, warum manchmal groovy MissingMethodException wirft, wenn Java-Code einen Getter aufruft und es eine Eigenschaft mit demselben Namen gibt?

Secondary Frage:Groovy MissingMethodException mit Signatur beim Zugriff auf Getter und NoSuchMethodError auf Vererbung

Können Sie erklären, warum meine erste Behelfslösung für den zweiten Anwendungsfall ungültig ist?

Das folgende Skript funktioniert, weil ich methodMissing

#!/usr/bin/env groovy  
@Grapes([ 
    @Grab(group='org.jvnet.hudson', module='xstream', version='1.4.7-jenkins-1'), 
]) 
def a 

println 'xstream' 
com.thoughtworks.xstream.XStream s = new com.thoughtworks.xstream.XStream() 
println s 
def reg1 = s.converterRegistry 
println "using property: $reg1" 

com.thoughtworks.xstream.XStream.metaClass.methodMissing = { String name, def args -> 
    println "missing $name" 
    if (name=="getConverterRegistry") { 
     return delegate.converterRegistry 
    } 
} 

def reg2 = s.getConverterRegistry() 
println "using getter : $reg2" 

println "ok" 

Dieses Skript druckt hinzugefügt:

[email protected] 
using property: [email protected] 
missing getConverterRegistry 
using getter : [email protected] 
ok 

Verfahren getConverterRegistry in XStream vorhanden ist, aber wenn Sie die methodMissing kommentieren Sie Sie bekommen:
groovy.lang.MissingMethodException: Keine Signatur der Methode: com.thoughtworks.xstream.XStream.getConv erterRegistry() ist für Argumenttypen:() Werte: [] bei TestXStream.run (TestXStream.groovy: 24)

Ich war voller Hoffnung, wenn diese Arbeit zu machen (auch wenn es nicht schön ist), aber mein Problem mein Code weiter, weil tatsächlich jenkins Bibliothek und der folgende Code funktioniert nicht mit:

#!/usr/bin/env groovy 

import hudson.util.XStream2 
import com.thoughtworks.xstream.XStream 

@Grapes([ 
    @Grab(group='org.jvnet.hudson', module='xstream', version='1.4.7-jenkins-1'), 
    @Grab(group='org.jenkins-ci.main', module='jenkins-core', version='1.642.3', transitive=false), 
]) 
def a 

XStream.metaClass.methodMissing = { String name, def args -> 
    println "missing $name for XStream" 
    if (name=="getConverterRegistry") { 
     return delegate.converterRegistry 
    } 
} 

def reg2 = new XStream().getConverterRegistry() 
println reg2 

XStream2.metaClass.methodMissing = { String name, def args -> 
    println "missing $name for XStream2" 
    if (name=="getConverterRegistry") { 
     return delegate.converterRegistry 
    } 
} 

println 'xstream2' 
XStream2 s2 = new XStream2() // internal call to this.getConverterRegistry() 
println "ok" 

und die Ausgabe:

missing getConverterRegistry for XStream 
[email protected] 
xstream2 
Caught: java.lang.NoSuchMethodError: hudson.util.XStream2.getConverterRegistry()Lcom/thoughtworks/xstream/converters/ConverterRegistry; 
java.lang.NoSuchMethodError: hudson.util.XStream2.getConverterRegistry()Lcom/thoughtworks/xstream/converters/ConverterRegistry; 
     at hudson.util.XStream2.wrapMapper(XStream2.java:188) 
     at com.thoughtworks.xstream.XStream.buildMapper(XStream.java:610) 
     at com.thoughtworks.xstream.XStream.<init>(XStream.java:568) 
     at com.thoughtworks.xstream.XStream.<init>(XStream.java:496) 
     at com.thoughtworks.xstream.XStream.<init>(XStream.java:465) 
     at com.thoughtworks.xstream.XStream.<init>(XStream.java:411) 
     at com.thoughtworks.xstream.XStream.<init>(XStream.java:350) 
     at hudson.util.XStream2.<init>(XStream2.java:89) 
     at TestXStream2.run(TestXStream2.groovy:33) 

Klasse XStream enthält eine Eigenschaft converterRegistry und seine Getter. XStream2 erweitert XStream und der Getter wird vererbt.

Beachten Sie, dass wenn ich dies von Eclipse ausführen, es funktioniert gut und wenn CLI verwenden, habe ich dieses Problem; möglicherweise, weil Eclipse diesen Code mehr als den Compiler ändern würde.

Irgendwelche Hinweise?

+0

Wenn Sie sagen "XStream enthält eine Eigenschaft ConverterRegistry und seine Getter" Sie meinen "XStream :: getConverterRegistry" ist nicht in XStream-Quellcode, richtig? Sie sprechen von dem, den Sie durch Metaprogrammierung hinzugefügt haben? – Will

+0

Ich verwende die benutzerdefinierte Version von jenkins: (https://github.com/jenkinsci/xstream/blob/1.4.7-jenkins-1/xstream/src/java/com/thoughtworks/xstream/XStream.java#L1493). (Danke für einen Blick BTW) –

+0

Nach etwas mehr Zeit habe ich nicht herausgefunden, ob es ein Problem mit Trauben oder groovy oder wenn ich etwas verpasst habe. Ich entschied mich schließlich, meinen Einstiegspunkt zu einem Java-Haupt zu wechseln und mit dem, was derselbe Classpath sein sollte, funktioniert es. –

Antwort

0

Ich habe das Problem fallen gelassen, indem ich für den Haupt-Launcher zurück zu Java gewechselt habe. Ich benutze das selbe über Jar als Abhängigkeit wie wenn ich Groovy und Traube benutzt habe.

Ich weiß nicht, ob es mit groovy oder Traube verwandt ist (ich vermute, groovy), aber ich arbeitete um es herum.