То, что вы пытаетесь сделать, сложно ...
Один из методов - использовать Eval.x
и передать карту как x
:
def setValue(Map map, String[] keys, String data) {
def command = "x.${keys.join('.')} = '$data'"
Eval.x(map, command)
}
Итак, команда будет выглядеть так: x.b1.b2.b3_1 = 'test'
, и мы оцениваем ее как x
, являющееся значением map
Другой (более уродливый) метод - использовать команду inject для обхода карты до последнего ключа, а затем установить значение последнего ключа этого возвращаемого объекта:
def setValue(Map map, String[] keys, String data) {
keys[0..-2].inject(map) { a, b -> a."$b" }."${keys[-1]}" = data
}
Вы должны быть осторожны при оценке кода, хотя и невольно ....
Например, вы можете получить следующие данные:
def name2 = "val = { -> println \"${System.properties.'user.name'}\" }.call(); def a"
Оценивает выражение (для меня):
x.val = { -> println "tim" }.call(); def a = 'test'
Который затем печатает имя пользователя ... Вы можете увидеть, как это может быть адаптировано для загрузки файла из Интернета и размещения его на чьей-то машине ...
Если вы можете ... Вам следует избегать этого ... Или, по крайней мере, иметь строгие белые списки того, что разрешено