2017-02-13 1 views
2

Я недоумеваю по поводу поведения Groovy. Я пропустил отладчик, чтобы попытаться определить, где в динамических миксинах эти кодовые пути могут пересекаться, но задавался вопросом, может ли кто-нибудь установить меня прямо здесь.Различные результаты при настройке/получении Свойства системы с помощью GStrings в 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

Смотрите этот ответ для проникновения в странное поведение Java '' 'объектов Properties''': HTTP://stackoverflow.com/questions/39038580/using-groovy-for-variable-expansion-in-java-properties/39043586#39043586 – BalRog

ответ

1
System.setProperty('key2', "value2$tdollar") 

При работе с помощью этого выше способа, то второй аргумент неявно в строку из GSTRING

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

это использование Базового setProperties метода в классе System (не SetProperty), и, следовательно, определяется по-разному, вызывая проблемы. GString не может быть правильно настроен или не преобразован в строку перед отправкой в ​​базовый класс java. Если изменить значение из GSTRING в строку, как это:

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

проблема исчезает

+0

Или просто принудите значение '' 'GString''' к' '' String''' значение, как показано ниже: '' 'System.properties ['key5'] =" value5 $ tdollar "as String''' – BalRog