Groovy如何实现变量存储表达式动态执行(等价Invoke-Expression)
原因
你当前的写法只是把代码文本作为字符串赋值给了变量,直接引用变量只会返回字符串本身,不会将字符串内容解析为Groovy代码执行,因此不会触发目录创建逻辑。
Groovy 等价 Invoke-Expression 的实现
Groovy 原生提供了动态执行字符串代码的能力,和PowerShell的Invoke-Expression功能完全对齐,常用实现有两种:
- 轻量单表达式执行:使用
Eval.me()方法,适合无额外上下文的简单代码执行,对应你的需求修改后的可运行代码如下:
def createDir = 'new File("new").mkdir()' // 执行字符串内的代码,返回执行结果 def createSuccess = Eval.me(createDir) println createSuccess // 目录创建成功会输出true
- 带上下文的灵活执行:使用
GroovyShell,支持给执行环境绑定自定义变量,适配更复杂的动态代码场景:
def shell = new GroovyShell() // 绑定执行上下文中的变量 shell.setVariable("targetDir", "new") def createDirCode = 'new File(targetDir).mkdirs()' shell.evaluate(createDirCode)
更优实践
如果不是强需求必须用字符串存储代码,优先用闭包存储可执行逻辑,没有代码注入风险,类型校验更可靠,执行性能也更高:
// 将逻辑封装在闭包中存储 def createDir = { new File("new").mkdir() } // 调用闭包执行逻辑 createDir.call()
注意:动态执行字符串代码存在代码注入风险,禁止将外部不可信输入拼接到待执行的代码字符串中。
内容的提问来源于stack exchange,提问作者MMA
相关产品推荐
相关产品推荐

