Java用ScriptEngine解析脚本

javax.script,始于JDK1.6,一般的用途主要是能解析通用的表达式就好,比如X >= 1(X作为参数传入)这样的表达式,也能利用js的函数语法,创造一个就像java的函数一样存在于内存中随时可以被调用的函数,更可以将js中的对象直接转换成java对象。
cript包下最主要的是ScriptEngineManager、ScriptEngine、CompiledScript和Bindings 4个类或接口。
ScriptEngineManager是一个工厂的集合,可以通过name或tag的方式获取某个脚本的工厂并生成一个此脚本的ScriptEngine,目前只有javascript的工厂。通过工厂函数得到了ScriptEngine之后,就可以用这个对象来解析脚本字符串了,直接调用Object obj = ScriptEngine.eval(String script)即可,返回的obj为表达式的值,比如true、false或int值。

CompiledScript可以将ScriptEngine解析一段脚本的结果存起来,方便多次调用。只要将ScriptEngine用Compilable接口强制转换后,调用compile(String script)就返回了一个CompiledScript对象,要用的时候每次调用一下CompiledScript.eval()即可,一般适合用于js函数的使用。

Bindings的概念算稍微复杂点,我的理解Bindings是用来存放数据的容器。它有3个层级,为Global级、Engine级和Local级,前2者通过ScriptEngine.getBindings()获得,是唯一的对象,而Local Binding由ScriptEngine.createBindings()获得,很好理解,每次都产生一个新的。Global对应到工厂,Engine对应到ScriptEngine,向这2者里面加入任何数据或者编译后的脚本执行对象,在每一份新生成的Local Binding里面都会存在。

public class App {

    public static void main(String[] args) {
        // ScriptEngineManager manager = new ScriptEngineManager();
        // ScriptEngine engine = manager.getEngineByName("js");
        // //传递变量
        // engine.put("a", 4);
        // engine.put("b", 6);
        // String script = "print ('hello script'+(a*b))";
        // try {
        // engine.eval(script);
        // } catch (ScriptException e) {
        // e.printStackTrace();
        // }

        // ScriptEngineManager manager = new ScriptEngineManager();
        // ScriptEngine engine = manager.getEngineByName("js");
        // Compilable compEngine = (Compilable) engine;
        // try {
        // CompiledScript script = compEngine.compile("function
        // max_num(a,b){return (a>b)?a:b;}");
        // Object eval = script.eval();
        // Invocable invoke = (Invocable) engine;
        // Object maxNum = invoke.invokeFunction("max_num",4,6);
        // System.out.println(maxNum);
        //
        // } catch (ScriptException e) {
        // e.printStackTrace();
        // } catch (NoSuchMethodException e) {
        // // TODO Auto-generated catch block
        // e.printStackTrace();
        // }
        try {
            ScriptEngine engine = new ScriptEngineManager().getEngineByName("javascript");
            Compilable compilable = (Compilable) engine;
            Bindings bindings = engine.createBindings(); // Local级别的Binding
            String script = "function add(op1,op2){return op1+op2} add(a, b)"; // 定义函数并调用
            CompiledScript JSFunction = compilable.compile(script); // 解析编译脚本函数
            bindings.put("a", 1);
            bindings.put("b", 2); // 通过Bindings加入参数
            Object result = JSFunction.eval(bindings);
            System.out.println(result); // 调用缓存着的脚本函数对象,Bindings作为参数容器传入
        } catch (Exception e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
    }

}

另外还有一个ScriptContext的概念,这个可能很少用到吧,它是用来连接ScriptEngine和Bindings的工具。

Bindings engineVariable = engine.getBindings(ScriptContext.ENGINE_SCOPE);//引擎范围存在的全局变量

参考内容:http://blog.11034.org/2010-12/java_scriptengine.html
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
在 Groovy 脚本解析 JSON 数据可以使用 Groovy 自带的 JsonSlurper 类。以下是示例代码: ```groovy import groovy.json.JsonSlurper def jsonString = '{"name": "John", "age": 30, "city": "New York"}' def jsonSlurper = new JsonSlurper() def jsonObject = jsonSlurper.parseText(jsonString) def name = jsonObject.name def age = jsonObject.age def city = jsonObject.city println "Name: $name" println "Age: $age" println "City: $city" ``` 在上面的示例代码中,我们首先定义了一个 JSON 字符串,然后通过 `JsonSlurper` 类解析该字符串,最后获取 JSON 中的字段值。 如果你想在 Groovy 脚本中调用 Java 的 `ScriptEngine.eval` 方法来解析 JSON 数据,可以使用以下示例代码: ```groovy import javax.script.ScriptEngineManager def jsonString = '{"name": "John", "age": 30, "city": "New York"}' def scriptEngineManager = new ScriptEngineManager() def engine = scriptEngineManager.getEngineByName("JavaScript") def script = "JSON.parse('$jsonString')" def jsonObject = engine.eval(script) def name = jsonObject.name def age = jsonObject.age def city = jsonObject.city println "Name: $name" println "Age: $age" println "City: $city" ``` 在上面的示例代码中,我们首先定义了一个 JSON 字符串,然后通过 `ScriptEngineManager` 类获取 JavaScript 引擎,再将 JSON 字符串传递给 `JSON.parse` 方法进行解析,最终得到一个对象。需要注意的是,当将 JSON 字符串传递给 `JSON.parse` 方法时,需要将字符串中的单引号转义为 `\'`,同时需要将 Groovy 变量用 `$` 括起来,以便在字符串中插入变量的值。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值