Groovy中如何动态解析模板化字符串并关联当前执行上下文?
在Groovy中动态解析含变量占位符的字符串(基于当前执行上下文)
针对你遇到的场景——动态解析来自外部的带${}占位符的字符串,且无需提前知晓模板中用到的变量名,直接复用当前执行上下文的变量,Groovy本身就有简洁的解决方案:
核心方案:利用内置binding对象 + StreamingTemplateEngine
Groovy脚本环境中默认提供了binding内置对象,它保存了当前执行上下文的所有变量。结合StreamingTemplateEngine就能自动完成占位符的解析替换,完全满足动态性要求。
示例代码:
def templateToResolve = "${hello}" // 来自外部的模板字符串,无需提前知道变量名 def hello = "world" def testVar = "another value" // 可测试多变量场景 // 初始化模板引擎并解析字符串 def engine = new groovy.text.StreamingTemplateEngine() def resolvedContent = engine.createTemplate(templateToResolve).make(binding.variables) println resolvedContent // 输出: world
关键细节说明
binding是Groovy脚本的内置对象,无需额外获取,直接调用binding.variables就能拿到当前上下文所有变量的键值对集合StreamingTemplateEngine会自动识别字符串中的${}占位符,匹配binding中的对应变量值完成替换,完全不需要硬编码变量名- 如果模板中用到的变量在当前上下文不存在,会输出空值(也可以通过自定义Binding添加默认值处理这种情况)
补充:针对类方法中的场景
如果是在Groovy类的方法中执行(而非脚本环境),binding不会自动注入,此时可以通过获取当前对象的属性集合来模拟上下文:
class Test { def hello = "world" def resolveTemplate(String template) { def props = this.metaClass.properties.findAll { it.name != 'metaClass' } .collectEntries { [it.name, it.getProperty(this)] } def engine = new groovy.text.StreamingTemplateEngine() return engine.createTemplate(template).make(props) } } def test = new Test() println test.resolveTemplate("${hello}") // 输出: world
内容的提问来源于stack exchange,提问作者user2668735
相关产品推荐
相关产品推荐

