加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 大数据 > 正文

使用GroovyShell作为“表达式求值器/引擎”(或:如何重用GroovyS

发布时间:2020-12-14 16:33:21 所属栏目:大数据 来源:网络整理
导读:我在我的程序中使用Groovy Shell作为“表达式评估器/引擎”.它接受两个输入:(a)一个或多个init脚本(b)用户定义的脚本.然后两者在运行时连接成大块脚本(文本)并提供给shell. String initScripts = getFromDB()String userScript = getFromUser()def shell =
我在我的程序中使用Groovy Shell作为“表达式评估器/引擎”.它接受两个输入:(a)一个或多个init脚本(b)用户定义的脚本.然后两者在运行时连接成大块脚本(文本)并提供给shell.

String initScripts = getFromDB()
String userScript = getFromUser()

def shell = new GroovyShell()
output = shell.evaluate(initScripts + userScript)

上面的代码将在循环中运行,其中userScript的内容会有所不同.

到目前为止,initScripts只包含可能在userScript中引用的变量定义(例如def $yyyy = new Date().format(‘yyyy’))(例如print“$yyyy 001”).

有没有更有效的方法呢? (例如,重复使用shell,怎么样?)因为现在它非常慢.

编辑:Groovy是必须的.请不要推荐其他脚本引擎.

编辑:我在想GroovyShell是否可以这样做(伪代码):

def shell = new GroovyShell()
shell.evaluate(initScripts)

for each userScript in DB {
    shell.put(userScript )
    def result = shell.evaluateThat()
    println "Result is $result"
}

这可能吗? (上次我用谷歌搜索它是不可能的,但我希望我错了)

解决方法

您可以缓存GroovyShell,您不需要总是创建一个新的:

final static GroovyShell shell = new GroovyShell()

此外,如果您多次运行一个脚本,您也可以缓存它们.您可以使用GroovyShell.parse(String scriptText)创建脚本,使用Script.run()运行脚本.

文档的This section也可能有用,而不是脚本,您也可以动态创建groovy对象.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读