Java脚本语言引擎接口

JSR 233 为 Java 设计了一套脚本语言 API。这一套 API 提供了在 Java 程序中调用各种脚本语言引擎的接口。任何实现了这一接口的脚本语言引擎都可以在 Java 程序中被调用。在 Mustang 的发行版本中包括了一个基于 Mozilla Rhino 的 JavaScript 脚本引擎。

通过jdk6以后提供的脚本引擎,java语言和脚本语言可以非常方便的交互,给我们进行 软件架构 带来新的思路。

import javax.script.*;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.Reader;
import java.util.HashMap;
import java.util.Map;

/**
 * Created by wangpl on 1/16/15.
 */
public class Test {
    public static void main(String[] args) throws ScriptException, FileNotFoundException, NoSuchMethodException {
        ScriptEngineManager manager = new ScriptEngineManager();
        // 打印所有的脚本引擎
        for (ScriptEngineFactory factory : manager.getEngineFactories()) {
            System.out.println(factory.getEngineName());
        }

        ScriptEngine engine = manager.getEngineByName ("JavaScript");
//        ScriptEngine engine = manager.getEngineByExtension ("js");
//        ScriptEngine engine = manager.getEngineByMimeType ("application/javascript");

        System.out.println(engine.getFactory().getEngineName());
        // 直接执行脚本
        engine.eval("print ('Hello World')");
        // 绑定java方法,供脚本使用
        HelloWorld hello = new HelloWorld();
        engine.put("script_hello", hello);//绑定
        engine.eval("script_hello.sayHello('Li Sir')");//在脚本中使用,也可以直接写在外部js文件中调用
        // 执行脚本文件
        engine.eval(new FileReader("/home/wangpl/mine/WORK_SPACE/idea_work/Eden/jse/src/main/java/HelloWorld.js"));

        // 脚本函数 调用
        String script = "function say(first,second) { print(first +' '+ second); }";
        engine.eval(script);
        Invocable inv = (Invocable) engine;
        inv.invokeFunction("say", "Hello", "Tony");

        //到目前为止,我们的脚本全部都是解释执行的,相比较之下编译执行将会获得更好的性能。这里将介绍 ScriptEngine 的另外一个可选接口 —— Compilable,
        //实现了Compilable接口的脚本引擎支持脚本的编译执行。下面这个例子实现了一个判断给定字符串是否是 email 地址或者 ip 地址的脚本:
        String myScript = "var email=/^[a-zA-Z0-9_-]+@[a-zA-Z0-9_-]"
                + "+(\\.[a-zA-Z0-9_-]+)+$/;";
        myScript += "var ip = /^(\\d{1,2}|1\\d\\d|2[0-4]\\d|25[0-5])"
                +"(\\.(\\d{1,2}|1\\d\\d|2[0-4]\\d|25[0-5])){3}$/;";
        myScript += "if(email.test(str)){println('it is an email')}"
                + "else if(ip.test(str)){println('it is an ip address')}"
                + "else{println('I don\\'t know')}";
        engine.put("str", "email@address.tony");
        Compilable compilable = (Compilable) engine;
        CompiledScript compiled = compilable.compile(myScript);
        compiled.eval();
    }
}

js文件内容:

print ('I am from HelloWorld.js')
script_hello.sayHello('JS Sir')

其它:

Apache BSF 提供了一个脚本语言交互框架, 具有更多功能。

http://www.ibm.com/developerworks/cn/java/j-lo-mustang-script/

http://www.ibm.com/developerworks/cn/web/wa-aj-javaee/

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值