Matrix42

不饱食以终日,不弃功于寸阴

Java动态性(3) - 脚本引擎执行javascript代码

1.脚本引擎执行JavaScript代码

  • 脚本引擎介绍

    使得Java应用程序可以通过一套固定的接口与各种脚本引擎交互,从而达到在Java平台上调用各种脚本语言的目的

    Java脚本API是连通Java平台和脚本语言的桥梁

    可以吧一些复杂异变的业务逻辑交给脚本语言处理,这又大大提高了开发效率

  • 获得脚本引擎对象

ScriptEngineManager sem = new ScriptEngineManager();
ScriptEngine engine = sem.getEngineByName("javascript");
  • Java脚本API为开发者提供了如下功能:

    • 获取脚本程序输入,通过脚本引擎运行脚本并返回运行结果,这是最核心的接口

      注意是:接口 Java可以使用各种不同的实现,从而通用的调用js,groovy,python等脚本

      Rhino是一种使用Java语言写的JavaScript的开源实现,原先由Mozilla开发,现在被集成进入JDK6.0以及以上版本

    • 通过脚本引擎的运行上下文在脚本和Java平台间交换数据

    • 通过Java应用程序调用函数脚本

a.js

function test(){
    var a = 3;
    var b = 4;
    print("invoke js file:"+(a+b));
}
test();
import java.io.FileReader;
import java.net.URL;
import javax.script.Invocable;
import javax.script.ScriptEngine;
import javax.script.ScriptEngineManager;

public class JavaScript {

    public static void main(String[] args) throws Exception {

        //获得脚本引擎对象
        ScriptEngineManager sem = new ScriptEngineManager();
        ScriptEngine engine = sem.getEngineByName("javascript");

        //定义变量,存储在引擎上下文中
        engine.put("msg", "I am a good man!");

        String str = "var user = {name:'Matrix42',age:18,schools:['清华大学','北京大学']};";

        str+= "print(user.name);";

        engine.eval(str);

        engine.eval("msg = 'Ha Ha';");

        System.out.println(engine.get("msg"));

        //定义函数
        engine.eval("function add(a,b){var sum = a + b; return sum;}");

        //取得调用接口
        Invocable jsInvocable = (Invocable) engine;

        //执行脚本中定义的方法
        Object result = jsInvocable.invokeFunction("add", new Object[]{13,20});

        System.out.println(result);

        //导入其他java包,使用其他包中的java类,如果想要深入了解可以学习Rhino
        //查资料说jdk8好像不支持,jdk7支持
        //- If you need JavaScript, use Java 7. 
        //- If you need Java 8, don't use JavaScript. 
        /*String jsCode = "importPackage(java.util);var list=Arrays.asList([\"北京大学\",\"清华大学\"]);";

        engine.eval(jsCode);

        List<String> list = (List<String>) engine.get("list");

        for(String string:list){
            System.out.println(string);
        }*/

        //执行一个js文件(将js放到src下即可)
        URL url = JavaScript.class.getClassLoader().getResource("a.js");
        FileReader fr = new FileReader(url.getPath());
        engine.eval(fr);
        fr.close();
    }

}

2.Rhino介绍

  • Rhino是一种使用java语言编写的JavaScript的开源实现,原先由Mozilla开发,现在被集成进入JDK6.0
  • 官方首页:https://developer.mozilla.org/en-US/docs/Mozilla/Projects/Rhino
点赞

发表评论

电子邮件地址不会被公开。 必填项已用*标注

2 × 5 =