访问getter时Groovy MissingMethodException带有签名,继承时NoSuchMethodError 您能解释一下,当java代码调用一个getter并且有一个同名属性时,groovy为什么有时会抛出MissingMethodException吗?

访问getter时Groovy MissingMethodException带有签名,继承时NoSuchMethodError 您能解释一下,当java代码调用一个getter并且有一个同名属性时,groovy为什么有时会抛出MissingMethodException吗?,groovy,dependency-management,Groovy,Dependency Management,第二个问题: 你能解释为什么我的第一个变通方法对于第二个用例无效吗? 以下脚本之所以有效,是因为我添加了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 = n

第二个问题:

你能解释为什么我的第一个变通方法对于第二个用例无效吗? 以下脚本之所以有效,是因为我添加了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"
此脚本打印:

com.thoughtworks.xstream.XStream@6c45ee6e
using property: com.thoughtworks.xstream.XStream$2@2e8e8225
missing getConverterRegistry
using getter  : com.thoughtworks.xstream.XStream$2@2e8e8225
ok
getConverterRegistry方法存在于中,但如果注释掉缺少的方法,则会得到:
groovy.lang.MissingMethodException:方法com.thoughtworks.xstream.xstream.getConverterRegistry()的签名不适用于参数类型:()值:[] 在TestXStream.run(TestXStream.groovy:24)

在实现这一点时,我充满了希望(尽管它并不漂亮),但我的问题仍然存在,因为我的代码实际上正在使用jenkins库,而以下代码不起作用:

#!/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"
以及输出:

missing getConverterRegistry for XStream
com.thoughtworks.xstream.XStream$2@c2db68f
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)
缺少XStream的getConverterRegistry
com.thoughtworks.xstream.xstream$2@c2db68f
xstream2
捕获:java.lang.NoSuchMethodError:hudson.util.XStream2.getConverterRegistry()Lcom/thoughtworks/xstream/ConverterRegistry;
java.lang.NoSuchMethodError:hudson.util.XStream2.getConverterRegistry()Lcom/thoughtworks/xstream/ConverterRegistry;
位于hudson.util.XStream2.wrapper(XStream2.java:188)
位于com.thoughtworks.xstream.xstream.buildMapper(xstream.java:610)
位于com.thoughtworks.xstream.xstream.(xstream.java:568)
位于com.thoughtworks.xstream.xstream.(xstream.java:496)
位于com.thoughtworks.xstream.xstream.(xstream.java:465)
位于com.thoughtworks.xstream.xstream.(xstream.java:411)
位于com.thoughtworks.xstream.xstream.(xstream.java:350)
位于hudson.util.XStream2.(XStream2.java:89)
在TestXStream2.run(TestXStream2.groovy:33)
类XStream包含属性converterRegistry及其getter。 XStream2扩展了XStream,并且继承了getter

请注意,当我在eclipse中运行它时,它工作正常,而在使用CLI时,我遇到了这个问题;可能是因为eclipse对该代码的更改比编译器更大


有什么线索吗?

我放弃了这个问题,将主启动器切换回普通Java。 我使用与使用groovy和grape时相同的über jar作为依赖项


我不知道它是否与groovy或grape有关(我怀疑是groovy),但我已经解决了这个问题。

我放弃了这个问题,转而使用纯Java作为主启动器。 我使用与使用groovy和grape时相同的über jar作为依赖项


我不知道它是与groovy还是grape有关(我怀疑是groovy),但我已经解决了它。

当你说“XStream包含属性converterRegistry及其getter”时,你的意思是
XStream::getConverterRegistry
不在XStream的源代码中,对吗?你是说你通过元编程添加的那个吗?我使用的是jenkins自定义版本:()。(顺便说一句,谢谢你看一下)在花了更多的时间之后,我没能找出这是一个与葡萄或groovy有关的问题,还是我错过了什么。我最终决定将我的入口点切换到Java main,并使用它应该使用的类路径。当你说“XStream包含属性converterRegistry及其getter”时,你的意思是
XStream::getConverterRegistry
不在XStream的源代码中,对吗?你是说你通过元编程添加的那个吗?我使用的是jenkins自定义版本:()。(顺便说一句,谢谢你看一下)在花了更多的时间之后,我没能找出这是一个与葡萄或groovy有关的问题,还是我错过了什么。我最终决定将我的入口点切换到一个Java main,并使用它应该使用的相同类路径。