在Groovy中发布填充映射

时间:2018-01-02 23:26:03

标签: groovy

我在groovy中遇到了一个有趣的问题,我正在尝试填充地图,由于某种原因它不起作用,这是程序(只是做了一个简单的版本来查看问题更容易):

rxjs

如果我删除:

public class dd2 {

    Map<String, String> subscriptions = ["Listing":"a Listing","Issue":"an Issue"]
    Map<String, Object> subscriptionAttributes = new HashMap<String, Object>()

    public static void main(String[] args) throws Exception {
        def dd = new dd2()
        dd.getSubscriptionAttributes()

    }

    def getSubscriptionAttributes(){
        subscriptions.each {
            def attributes = ""
            println "getting ${it.key}"
            subscriptionAttributes.put(it.key, attributes)
        }
    }

}

它遍历整个订阅地图。如果我尝试添加到subscriptionAttributes映射,它将只获得列表,直到最终我得到堆栈溢出。

我做错了什么?

1 个答案:

答案 0 :(得分:3)

这是由于def getSubscriptionAttributes()方法名称 - 当定义了getter方法时,Groovy会在您使用属性名称的任何地方使用它。所以在你的情况下,你得到:

*** java.lang.instrument ASSERTION FAILED ***: "!errorOutstanding" with message transform method call failed at JPLISAgent.c line: 844
*** java.lang.instrument ASSERTION FAILED ***: "!errorOutstanding" with message transform method call failed at JPLISAgent.c line: 844
*** java.lang.instrument ASSERTION FAILED ***: "!errorOutstanding" with message transform method call failed at JPLISAgent.c line: 844
Exception in thread "main" java.lang.StackOverflowError
    at sun.net.www.protocol.file.Handler.parseURL(Handler.java:67)
    at java.net.URL.<init>(URL.java:622)
    at java.net.URL.<init>(URL.java:490)
    at sun.misc.URLClassPath$FileLoader.getResource(URLClassPath.java:1259)
    at sun.misc.URLClassPath.getResource(URLClassPath.java:239)
    at java.net.URLClassLoader$1.run(URLClassLoader.java:365)
    at java.net.URLClassLoader$1.run(URLClassLoader.java:362)
    at java.security.AccessController.doPrivileged(Native Method)
    at java.net.URLClassLoader.findClass(URLClassLoader.java:361)
    at java.lang.ClassLoader.loadClass(ClassLoader.java:424)
    at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:335)
    at java.lang.ClassLoader.loadClass(ClassLoader.java:357)
    at groovy.lang.Closure.call(Closure.java:416)
    at groovy.lang.Closure.call(Closure.java:430)
    at org.codehaus.groovy.runtime.DefaultGroovyMethods.callClosureForMapEntry(DefaultGroovyMethods.java:5278)
    at org.codehaus.groovy.runtime.DefaultGroovyMethods.each(DefaultGroovyMethods.java:2117)
    at org.codehaus.groovy.runtime.dgm$164.invoke(Unknown Source)
    at org.codehaus.groovy.runtime.callsite.PojoMetaMethodSite$PojoMetaMethodSiteNoUnwrapNoCoerce.invoke(PojoMetaMethodSite.java:274)
    at org.codehaus.groovy.runtime.callsite.PojoMetaMethodSite.call(PojoMetaMethodSite.java:56)
    at org.codehaus.groovy.runtime.callsite.AbstractCallSite.call(AbstractCallSite.java:125)
    at dd2.getSubscriptionAttributes(dd2.groovy:13)
    at sun.reflect.GeneratedMethodAccessor3.invoke(Unknown Source)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.lang.reflect.Method.invoke(Method.java:498)
    at org.codehaus.groovy.reflection.CachedMethod.invoke(CachedMethod.java:93)
    at groovy.lang.MetaMethod.doMethodInvoke(MetaMethod.java:325)
    at groovy.lang.MetaClassImpl.getProperty(MetaClassImpl.java:1850)
    at groovy.lang.MetaClassImpl.getProperty(MetaClassImpl.java:3758)
    at dd2.getProperty(dd2.groovy)
    at org.codehaus.groovy.runtime.InvokerHelper.getProperty(InvokerHelper.java:174)
    at groovy.lang.Closure.getPropertyTryThese(Closure.java:312)
    at groovy.lang.Closure.getPropertyOwnerFirst(Closure.java:306)
    at groovy.lang.Closure.getProperty(Closure.java:295)
    at org.codehaus.groovy.runtime.callsite.PogoGetPropertySite.getProperty(PogoGetPropertySite.java:50)
    at org.codehaus.groovy.runtime.callsite.AbstractCallSite.callGroovyObjectGetProperty(AbstractCallSite.java:307)
    at dd2$_getSubscriptionAttributes_closure1.doCall(dd2.groovy:16)
    at sun.reflect.GeneratedMethodAccessor1.invoke(Unknown Source)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.lang.reflect.Method.invoke(Method.java:498)
    at org.codehaus.groovy.reflection.CachedMethod.invoke(CachedMethod.java:93)
    at groovy.lang.MetaMethod.doMethodInvoke(MetaMethod.java:325)
    at org.codehaus.groovy.runtime.metaclass.ClosureMetaClass.invokeMethod(ClosureMetaClass.java:294)
    at groovy.lang.MetaClassImpl.invokeMethod(MetaClassImpl.java:1022)
    at groovy.lang.Closure.call(Closure.java:414)
at groovy.lang.Closure.call(Closure.java:430)

因为当你说:

subscriptionAttributes.put(it.key, attributes)

Groovy实际上正在尝试:

getSubscriptionAttributes().put(it.key, attributes)

然后你进入无限循环。

更改您的方法名称,使其不与内部地图变量冲突,您就可以了。