问题描述
Groovy在这里的行为使我感到困惑。我已经运行了一些调试器,试图确定动态混合器中的哪些位置,这些代码路径可能会越过,但是想知道是否有人可以直接在这里设置我。
基本上,在设置系统属性时使用GString作为值,这取决于我如何设置属性,该属性并不总是通过某些方法可读。
我见过和为什么groovy在字典中看不到某些值?但我的问题具体适用于地图值,所以不确定那些适用于或不是?
片段:
def tdollar ='dollar'
System.setProperty('key1','value1')
System.setProperty('key2',value2 $ tdollar )
//替换下面的内容使用除
以外的任何属性设置方法//上述结果相同
System.properties ['key4'] ='value4'
System.properties ['key5'] =value5 $ t $
println System.hasProperty('key1')
println System.hasProperty('key2')
println System.hasProperty('key4')
println System.hasProperty('key5')
println
$ b println System.getProperty('key1')
println System.getProperty('key2')
println系统.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.n ame,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。路径,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隐式转换为String
System.properties ['key5'] =value5 $ tdollar
这会使用System类中的 setProperties 方法(而不是 setProperty ),并因此得到解决不同地导致问题。在发送到底层java类之前,GString可能无法正确转换或未转换为字符串。如果您将值从GString更改为像这样的字符串:
System.properties ['key5'] =value5 + tdollar
问题消失
I'm perplexed by Groovy's behavior here. I've run through the debugger some to try to determine where in the dynamic mixins these code paths may be getting crossed but wondered if anyone could set me straight here.
Basically, in setting a system property with a GString for a value, depending on how I set the property, the property is not always readable back via certain methods.
I have seen Why Map does not work for GString in Groovy? and Why groovy does not see some values in dictionary? but my question specifically applies to map values so not sure those apply or not?
Snippet :
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']
Output:
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
Why, if I don't use System.setProperty(key, value)
syntax, is the property not readable via System.getProperty(key)
, but is still readable via any other method?
Given this behavior, is there a best practice documented regarding System properties in Groovy.
Writing this, I wonder if this is just a general map question. Will test.
System.setProperty('key2', "value2$tdollar")
When you operate using this above method, the second argument is implicitly cast to a String from a GString
System.properties['key5']="value5$tdollar"
this use the underlying setProperties method in the System class (not setProperty), and hence gets resolved differently, causing issues. The GString might not be getting cast correctly or not getting converted to a string before being sent to the underlying java class. If you change the value from a GString to a string like this:
System.properties['key5']="value5" + tdollar
the issue disappears
这篇关于使用Groovy中的GStrings设置/获取系统属性时的结果不同的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持!