Groovy - GroovyShell

Summary

  • 执行一个外部的脚本。
  • 如果单独执行一个脚本我们一行一行写就行,如果需要传入参数,返回参数,我们就定义一个 Closure

Demo

import groovy.json.JsonSlurper

class Main {
    static void main(args) {
        def shell = new GroovyShell()

        // 要执行的脚本内容,是一行一行的代码,在 shell.evaluate(script) 的时候,就是逐行执行。
        // 如果最后有 return 语句,就可以接收返回结果。
        String script =
        """
        println 'Script!'
        return "222"
        """
        def scriptResult = shell.evaluate(script)


        // 要执行的脚本内容是一个 Closure 对象,在执行的时候就返回一个 Closure 对象,
        // 调用该 Closure 对象的 call() 方法,获取对应的值。
        String closure =
        """
        { dataMap -> println "Groovy!"; return "返回值"}
        """

        // 返回的是 Script 对象,对象里面是一个 Closure 对象,需要执行才能返回结果。
        def closureResult = shell.evaluate(closure)
        println(closureResult())
    }
}

Demo

package info.aoye

import grails.gorm.transactions.Transactional

@Transactional
class ComponentDemoService {

    static scope = "singleton"

    // 传递过来一个组件对象脚本对象,一个 Object 类型 param
    def evaluate(Component component, Object object) {
        def shell = new GroovyShell()
        def closure
        def result

        try
        {
            closure = shell.evaluate(component?.script)
            // 如果不需要参数,就直接执行脚本
            if (!object)
            {
                println("111")
                result = closure
            }
            else
            {
                // 如果是有参数,返回 Closure 对象,这里需要执行一下这个 Closure。
                result = closure(object)
            }
        }
        catch (Exception e)
        {
            println e
            result = e
        }

        return result
    }
}
posted @ 2020-06-19 15:47  duchaoqun  阅读(1433)  评论(0编辑  收藏  举报