Java 利用脚本API运行Groovy脚本的方式

2 篇文章 0 订阅
2 篇文章 0 订阅

Java运行脚本语言的方式(以Groovy为例)

介绍

运用java Script API可以非常方便的运行能够在JVM运行的脚本程序,并通过其脚本引擎进行参数传递等。

Java Scripting API 包含一组类和接口,在 javax.script 包中定义。这是一个相对比较小的 Java 包,以 ScriptEngineManager 类作为起点。一个 ScriptEngineManager 对象可以通过 JAR 文件服务发现机制来查找脚本引擎(有点类似于JDBC, slf4J等),而实例化 ScriptEngine 对象的解析脚本使用专门的脚本语言编写。更多关于 javax.script 包的详细信息请看 Java SE规范http://docs.oracle.com/javase/8/docs/api/javax/script/package-summary.html

使用方法

maven引入Groovy引擎依赖

<!-- for executing groovy script -->
<dependencies>
    <dependency>
        <groupId>org.codehaus.groovy</groupId>
        <artifactId>groovy</artifactId>
        <version>2.4.12</version>
    </dependency>
    <dependency>
        <groupId>org.codehaus.groovy</groupId>
        <artifactId>groovy-jsr223</artifactId>
        <version>2.4.12</version>
        <scope>runtime</scope>
    </dependency>
</dependencies>

使用ScriptEngineManager获取对应语言的脚本引擎

ScriptEngineManager manager = new ScriptEngineManager();
ScriptEngine engine = manager.getEngineByName("groovy");

通过engine对象执行脚本语句,调用脚本对象方法等

Bindings bindings = engine.createBindings();
bindings.put("name", "Johnson");
engine.eval("def getName(){return name;}", bindings);

示例封装代码

import java.io.Reader;
import java.util.HashMap;
import java.util.Map;

import javax.script.Bindings;
import javax.script.Invocable;
import javax.script.ScriptEngine;
import javax.script.ScriptEngineManager;
import javax.script.ScriptException;

/**
 * 执行脚本工具
 * 
 * Created by xuyh at 2017年7月18日 上午11:05:49.
 */
public class ScriptUtils {
    /**
     * 脚本语言groovy
     */
    public static final String SCRIPT_GROOVY = "groovy";
    /**
     * 脚本语言javascript
     */
    public static final String SCRIPT_JAVASCRIPT = "javaScript";

    private static ScriptEngineManager engineManager = new ScriptEngineManager();
    /**
     * 脚本引擎缓存
     */
    private static Map<String, ScriptEngine> scriptEngineMap = new HashMap<>();

    /**
     * 获取脚本引擎
     * 
     * @param scriptLang 脚本语言 (groovy, javaScript, etc.)
     * @return
     */
    public static ScriptEngine getEngine(String scriptLang) {
        ScriptEngine engine = scriptEngineMap.get(scriptLang);
        if (engine == null) {
            engine = engineManager.getEngineByName(scriptLang);
            scriptEngineMap.put(scriptLang, engine);
        }
        return engine;
    }

    /**
     * 执行脚本中的方法
     * 
     * @param scriptLang 脚本语言
     * @param script 需要执行的脚本文本
     * @param bindings 给脚本设置的全局变量数据
     * @param functionName 执行的方法名
     * @return
     * @throws ScriptException 
     * @throws NoSuchMethodException 
     */
    public static Object invokeScriptFunction(String scriptLang, String script, String functionName,
            Map<String, Object> bindings)
            throws ScriptException, NoSuchMethodException {
        ScriptEngine engine = getEngine(scriptLang);
        Bindings data = engine.createBindings();
        for (String key : bindings.keySet()) {
            data.put(key, bindings.get(key));
        }
        engine.eval(script, data);
        return ((Invocable) engine).invokeFunction(functionName);
    }

    /**
     * 执行脚本中的方法
     * 
     * @param scriptLang 脚本语言
     * @param script 需要执行的脚本文本
     * @param args 执行脚本方法传入的参数
     * @param functionName 执行的方法名
     * @return
     * @throws ScriptException 
     * @throws NoSuchMethodException 
     */
    public static Object invokeScriptFunction(String scriptLang, String script, String functionName, Object... args)
            throws ScriptException, NoSuchMethodException {
        ScriptEngine engine = getEngine(scriptLang);
        engine.eval(script);
        return ((Invocable) engine).invokeFunction(functionName, args);
    }

    /**
     * 执行脚本中的方法
     * 
     * @param scriptLang 脚本语言
     * @param bindings 给脚本设置的全局变量数据
     * @param script 需要执行的脚本文本
     * @param args 执行脚本方法传入的参数
     * @param functionName 执行的方法名
     * @return
     * @throws ScriptException 
     * @throws NoSuchMethodException 
     */
    public static Object invokeScriptFunction(String scriptLang, Map<String, Object> bindings, String script,
            String functionName,
            Object... args) throws ScriptException, NoSuchMethodException {
        ScriptEngine engine = getEngine(scriptLang);
        Bindings data = engine.createBindings();
        for (String key : bindings.keySet()) {
            data.put(key, bindings.get(key));
        }
        engine.eval(script, data);
        return ((Invocable) engine).invokeFunction(functionName, args);
    }

    /**
     * 执行脚本中的方法
     * 
     * @param scriptLang 脚本语言
     * @param reader 需要执行的脚本文件
     * @param bindings 给脚本设置的全局变量数据
     * @param functionName 执行的方法名
     * @return
     * @throws ScriptException 
     * @throws NoSuchMethodException 
     */
    public static Object invokeFileScriptFunction(String scriptLang, Reader reader, String functionName,
            Map<String, Object> bindings)
            throws ScriptException, NoSuchMethodException {
        ScriptEngine engine = getEngine(scriptLang);
        Bindings data = engine.createBindings();
        for (String key : bindings.keySet()) {
            data.put(key, bindings.get(key));
        }
        engine.eval(reader, data);
        return ((Invocable) engine).invokeFunction(functionName);
    }

    /**
     * 执行脚本中的方法
     * 
     * @param scriptLang 脚本语言
     * @param reader 需要执行的脚本文件
     * @param args 执行脚本方法传入的参数
     * @param functionName 执行的方法名
     * @return
     * @throws ScriptException 
     * @throws NoSuchMethodException 
     */
    public static Object invokeFileScriptFunction(String scriptLang, Reader reader, String functionName, Object... args)
            throws ScriptException, NoSuchMethodException {
        ScriptEngine engine = getEngine(scriptLang);
        engine.eval(reader);
        return ((Invocable) engine).invokeFunction(functionName, args);
    }

    /**
     * 执行脚本中的方法
     * 
     * @param scriptLang 脚本语言
     * @param bindings 给脚本设置的全局变量数据
     * @param reader 需要执行的脚本文件
     * @param args 执行脚本方法传入的参数
     * @param functionName 执行的方法名
     * @return
     * @throws ScriptException 
     * @throws NoSuchMethodException 
     */
    public static Object invokeFileScriptFunction(String scriptLang, Map<String, Object> bindings, Reader reader,
            String functionName,
            Object... args) throws ScriptException, NoSuchMethodException {
        ScriptEngine engine = getEngine(scriptLang);
        Bindings data = engine.createBindings();
        for (String key : bindings.keySet()) {
            data.put(key, bindings.get(key));
        }
        engine.eval(reader, data);
        return ((Invocable) engine).invokeFunction(functionName, args);
    }
}
  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值