我对Groovy的行为感到困惑。我已经通过调试器来尝试确定这些代码路径在动态混合中的位置可能会越过,但是想知道是否有人可以直接在这里设置我。
基本上,在为值设置带有GString的系统属性时,根据我设置属性的方式,该属性并不总是通过某些方法可读回来。
我看过Why Map does not work for GString in Groovy?和Why groovy does not see some values in dictionary?,但我的问题特别适用于地图值,所以不确定是否适用?
摘录:
def tdollar='dollar'
System.setProperty('key1', 'value1')
System.setProperty('key2', "value2$tdollar")
// Replace the below with any property setting method other than
// the above with the same results
System.properties['key4']='value4'
System.properties['key5']="value5$tdollar"
println System.hasProperty('key1')
println System.hasProperty('key2')
println System.hasProperty('key4')
println System.hasProperty('key5')
println
println System.getProperty('key1')
println System.getProperty('key2')
println System.getProperty('key4')
println System.getProperty('key5')
println
println System.properties.keySet()
println
println System.properties['key1']
println System.properties['key2']
println System.properties['key4']
println System.properties['key5']
输出:
null
null
null
null
value1
value2dollar
value4
null
[java.runtime.name, sun.boot.library.path, java.vm.version, gopherProxySet, java.vm.vendor, java.vendor.url, path.separator, java.vm.name, file.encoding.pkg, user.country, sun.java.launcher, sun.os.patch.level, program.name, key5, key4, java.vm.specification.name, user.dir, key2, java.runtime.version, key1, java.awt.graphicsenv, java.endorsed.dirs, os.arch, java.io.tmpdir, line.separator, java.vm.specification.vendor, os.name, tools.jar, sun.jnu.encoding, script.name, java.library.path, java.specification.name, java.class.version, sun.management.compiler, os.version, user.home, user.timezone, java.awt.printerjob, file.encoding, java.specification.version, java.class.path, user.name, java.vm.specification.version, sun.java.command, java.home, sun.arch.data.model, user.language, java.specification.vendor, awt.toolkit, java.vm.info, java.version, java.ext.dirs, sun.boot.class.path, java.vendor, file.separator, java.vendor.url.bug, sun.io.unicode.encoding, sun.cpu.endian, groovy.starter.conf, groovy.home, sun.cpu.isalist]
value1
value2dollar
value4
value5dollar
如果我不使用System.setProperty(key, value)
语法,为什么该属性不能通过System.getProperty(key)
读取,但仍然可以通过任何其他方法读取?
鉴于此行为,是否有关于Groovy中的系统属性的最佳实践。
写这个,我想知道这只是一个普通的地图问题。将测试。
答案 0 :(得分:1)
System.setProperty('key2', "value2$tdollar")
使用上述方法操作时,第二个参数将从GString
隐式转换为StringSystem.properties['key5']="value5$tdollar"
这使用System类中的基础 setProperties 方法(不是 setProperty ),因此会以不同方式解析,从而导致出现问题。在发送到底层java类之前,GString可能无法正确转换或未转换为字符串。如果您将值从GString更改为如下字符串:
System.properties['key5']="value5" + tdollar
问题消失