java对脚本语言的支持

脚本语言的支持

JSR 223中规范了在Java虚拟机上运行的脚本语言与Java程序之间的交互方式。JSR 233是JavaSE6的一部分,在Java表中API中的包是javax.script。目前Java虚拟机支持比较多的脚本语言,比较流行的有JavaScript、Scala、JRuby、Jython和Groovy等。

脚本引擎

Java中执行脚本需要脚本语言对应的脚本引擎,JSR 233 定义了脚本引擎的注册和查找机制。JavaSE6 中自带了JavaScript 语言的脚本引擎,可以通过三种方式获取到脚本引擎。

// 通过脚本名称获取
ScriptEngine engine = new ScriptEngineManager().getEngineByName("JavaScript");
// 通过文件扩展名获取
ScriptEngine engine1 = new ScriptEngineManager().getEngineByExtension("js");  
// 通过 MIME 类型来获取
ScriptEngine engine2 = new ScriptEngineManager().getEngineByMimeType("text/javascript");

调用脚本语言

1、使用 eval(String script) 直接调用脚本语言。

// 获取 ScriptEngineManager 对象用于创建 ScriptEngine 对象
ScriptEngineManager manager = new ScriptEngineManager();
ScriptEngine engine = manager.getEngineByName("javascript");
// 通过 eval 方法可以调用脚本语句,获取返回值
Double hour = (Double) engine.eval("var date = new Date();" + "date.getHours();");
System.out.println("hour : " + hour);

2、使用 put(String key,Object value) 在ScriptEngine 的状态下设置一个键/值对,以便在脚本中调用。

ScriptEngineManager manager = new ScriptEngineManager();
ScriptEngine engine = manager.getEngineByName("javascript");
// 设置一个变量名为 name 值为 abcdefg
engine.put("name", "abcdefg");
// js 代码将 name 从后往前赋值给 output
engine.eval("var output ='' ;" + "for (i = 0; i <= name.length; i++) { " + " output = name.charAt(i) + output" + "}");
// 获取在该引擎下的值
String name = (String) engine.get("output");
System.out.printf("被翻转后的字符串:%s \n", name);

3、使用 eval(Stirng script,Bindings n) 执行脚本,并传入脚本所需要的参数,Bindings 其实也是键值对的一个类,继承自 Map。

// 定义一个脚本语句
String str="Math.pow(a,b)";
// 定义一个 Map,往里面赋值用于传参
Map<String, Object>input=new TreeMap<>();
input.put("a",2);
input.put("b",8);
ScriptEngineManager manager = new ScriptEngineManager();
ScriptEngine engine = manager.getEngineByName("javascript");
// 调用 eval 方法,第一个参数为脚本语句,第二个参数为键值对 SimpleBindings 实现了 Bindings
System.out.println(engine.eval(str,new SimpleBindings(input)));

4、调用 js 函数,并传入参数

ScriptEngineManager manager = new ScriptEngineManager();
ScriptEngine engine = manager.getEngineByName("javascript");
engine.eval("function add (a, b) {return a+b; }");
// 由ScriptEngines实现的可选接口,其方法允许在先前执行的脚本中调用过程。 
Invocable jsInvoke = (Invocable) engine;
// 用于调用脚本中定义的顶级过程和函数
Object res = jsInvoke.invokeFunction("add", new Object[] { 10, "5" });
System.out.println(res);

5、java 中获取 js 对象

String str = "  var obj=new Object();     "
                + "  obj.info='hello world';   "
                + "  obj.getInfo=function(){   "
                + "        return this.info;   "
                + "  };                        ";
ScriptEngineManager manager = new ScriptEngineManager();
ScriptEngine engine = manager.getEngineByName("javascript");
engine.eval(str);
//获取对象
ScriptObjectMirror obj=(ScriptObjectMirror) engine.get("obj");
//输出属性
System.out.println(obj.get("info"));
System.out.println(obj.get("getInfo"));
str="obj.getInfo()";
//执行方法
System.out.println(engine.eval(str));
String str = "  var msg='hello';          "
                + "  var number = 123;         "
                + "  var array=['A','B','C'];  "
                + "  var json={                "
                + "      'name':'pd',          "
                + "      'subjson':{           "
                + "           'subname':'spd'  "
                + "           ,'id':123        "
                + "           }                "
                + "      };                    ";
        ScriptEngineManager manager = new ScriptEngineManager();
        ScriptEngine engine = manager.getEngineByName("javascript");
        //执行语句
        engine.eval(str);
        str="msg+=' world';number+=5";
        //再次执行
        engine.eval(str);
        //获取js变量msg(String类型)
        System.out.println(engine.get("msg"));
        //获取js变量msg(int类型)
        System.out.println(engine.get("number"));
        //获取js变量array(数组)
        ScriptObjectMirror array=(ScriptObjectMirror) engine.get("array");
        //getSlot(int index)函数用于获取下标为index的值
        System.out.println(array.getSlot(0));
        //获取js变量json(json类型)
        ScriptObjectMirror json=(ScriptObjectMirror) engine.get("json");
        //get(String key)函数用于键key的值
        System.out.println(json.get("name"));
        //获取js变量subjson(嵌套json类型)
        ScriptObjectMirror subjson=(ScriptObjectMirror)json.get("subjson");
        System.out.println(subjson.get("subname"));

其他的内容就根据API进行深入学习吧

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值