在Groovy中使用gstring设置/获取系统属性时的不同结果

在Groovy中使用gstring设置/获取系统属性时的不同结果,groovy,properties,maps,Groovy,Properties,Maps,我对Groovy在这里的行为感到困惑。我已经运行了一些调试器,试图确定在动态混合中,这些代码路径可能会在何处交叉,但不知道是否有人可以在这里直接告诉我 基本上,在使用GString设置系统属性作为值时,根据我设置属性的方式,该属性并不总是可以通过某些方法读取回来 我看到了,但我的问题特别适用于地图值,所以不确定这些值是否适用 片段: def tdollar='dollar' System.setProperty('key1', 'value1') System.setProperty('key

我对Groovy在这里的行为感到困惑。我已经运行了一些调试器,试图确定在动态混合中,这些代码路径可能会在何处交叉,但不知道是否有人可以在这里直接告诉我

基本上,在使用GString设置系统属性作为值时,根据我设置属性的方式,该属性并不总是可以通过某些方法读取回来

我看到了,但我的问题特别适用于地图值,所以不确定这些值是否适用

片段:

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中是否有关于系统属性的最佳实践记录

写这篇文章,我想知道这是否只是一个一般的地图问题。将进行测试

System.setProperty('key2', "value2$tdollar")
当您使用上述方法进行操作时,第二个参数将从GString隐式转换为字符串

System.properties['key5']="value5$tdollar"
这使用系统类中的底层setProperties方法(而不是setProperty),因此得到不同的解决,从而导致问题。GString可能没有正确地进行强制转换,或者在发送到基础java类之前没有转换为字符串。如果将值从GString更改为如下所示的字符串:

System.properties['key5']="value5" + tdollar

问题消失了

查看此答案,了解java
属性
对象的奇怪行为:或者将
GString
值强制为
字符串
值,如下所示:
System.Properties['key5']=“value5$tdolar”作为字符串