如何在存储在字符串中时使用groovy来评估$ {sth}?

时间:2012-02-13 09:48:03

标签: groovy

我收到的文本里面包含${somethingElse},但它只是一个普通的字符串。

我上课了:

class Whatever {

    def somethingElse = 5

    void action(String sth) {
        def test = []
        test.testing = sth
        assert test.testing == 5

    }
}

是否可以使用groovy?

编辑:

我的场景是:加载xml文件,其中包含的值的节点指向我的应用程序中的其他值。所以我要说shell.setVariable("current", myClass)。现在,在我的xml中,我希望能够将${current.someField}作为值。 麻烦的是,xml的值是一个字符串,我无法轻易评估它。 我无法预测这些“价值”将如何由用户创建,我只是让他们能够使用几个类。

我无法在加载xml文件时转换它,它必须是“按需”,因为我在特定情况下使用它,我希望它们能够在那个时刻使用值,而不是在xml时文件已加载。

任何提示?

2 个答案:

答案 0 :(得分:2)

你可以做的一件事是:

class Whatever {

  def somethingElse = 5

  void action( String sth ) {
    def result = new groovy.text.GStringTemplateEngine().with {
      createTemplate( sth ).make( this.properties ).toString()
    }
    assert result == "Number 5"
  }
}

// Pass it a String
new Whatever().action( 'Number ${somethingElse}' )

答案 1 :(得分:0)

首先,我们做了什么,在xml中使用了这种格式:

normalText#codeToExecuteOrEvaluate#normalText

并使用replace闭包来代表regexp和groovyShell.evaluate()。 疯。花了很多时间和很多记忆。

最后,我们将格式更改为原始格式以及我们希望能够评估的每个字符串的crated脚本:

Script script = shell.parse("\""+stringToParse+"\"")

,其中

stringToParse = "Hello world @ ${System.currentTimeMillis()}!!"

然后我们可以根据需要多次调用script.run()并且一切都运行良好。 它实际上仍然存在。