Различные результаты при настройке / получении свойств системы с помощью GStrings в Groovy

Я озадачен поведением Groovy здесь. Я пробежался по отладчику, чтобы попытаться определить, где в динамических миксинах эти пути кода могут пересекаться, но мне было интересно, может ли кто-нибудь установить меня прямо здесь.

По сути, при установке системного свойства с помощью GString для значения, в зависимости от того, как я устанавливаю свойство, свойство не всегда может быть прочитано обратно с помощью определенных методов.

Я видел, почему карта не работает для GString в Groovy? а почему groovy не видит некоторые значения в словаре? но мой вопрос конкретно относится к значениям карты, поэтому не уверены, что они применимы или нет?

Фрагмент:

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.

Записывая это, мне интересно, если это просто вопрос карты. Буду тестировать.

1 ответ

Решение
System.setProperty('key2', "value2$tdollar")

Когда вы работаете с использованием вышеуказанного метода, второй аргумент неявно приводится к String из GString

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

это использует базовый метод setProperties в классе System (не setProperty) и, следовательно, решается по-разному, вызывая проблемы. Возможно, строка GString не была правильно преобразована или преобразована в строку перед отправкой в ​​базовый класс Java. Если вы измените значение с GString на строку, подобную этой:

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

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

Другие вопросы по тегам