JDK1.8中如何用ScriptEngine动态执行JS

jdk1.6开始就提供了动态脚本语言诸如JavaScript动态的支持。这无疑是一个很好的功能,毕竟Java的语法不是适合成为动态语言。而JDK通过执行JavaScript脚本可以弥补这一不足。这也符合“Java虚拟机不仅仅是Java一种语言的虚拟机“这一目标。

ScriptEngine功能强大,基本能实现笔者所能想到的Java与JavaScript交互的需求。而且十分的方便简洁。jdk1.8又对ScriptEngine接口进行了一定改变,因此,在jdk1.8能运行的代码,在1.6中可能会报错,反之亦然。

下面通过具体的代码讲解:

import java.util.Map;
import java.util.TreeMap; import javax.script.Invocable;
import javax.script.ScriptEngine;
import javax.script.ScriptEngineManager;
import javax.script.SimpleBindings; import jdk.nashorn.api.scripting.ScriptObjectMirror; public class JSEngine {
public static ScriptEngine engine;
private static String str;
//该函数测试Java获取JS变量值的能力
public static void getJsValue() throws Exception{
str = " var msg='hello'; "
+ " var number = 123; "
+ " var array=['A','B','C']; "
+ " var json={ "
+ " 'name':'pd', "
+ " 'subjson':{ "
+ " 'subname':'spd' "
+ " ,'id':123 "
+ " } "
+ " }; ";
//执行语句
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"));
}
//该函数测试Java与js对象
public static void getObject() throws Exception{
str = " var obj=new Object(); "
+ " obj.info='hello world'; "
+ " obj.getInfo=function(){ "
+ " return this.info; "
+ " }; ";
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));
}
//java将变量导入js脚本
public static void putValue() throws Exception{
str="Math.pow(a,b)";
Map<String, Object>input=new TreeMap<>();
input.put("a",2);
input.put("b",8);
System.out.println(engine.eval(str,new SimpleBindings(input)));
}
//调用js函数
public static void callJsFunction() throws Exception{
engine.eval("function add (a, b) {return a+b; }");
Invocable jsInvoke = (Invocable) engine;
Object res = jsInvoke.invokeFunction("add", new Object[] { 10, 5 });
System.out.println(res);
}
public static void main(String[] args) throws Exception {
//获取js引擎实例
ScriptEngineManager sem = new ScriptEngineManager();
engine=sem.getEngineByName("javascript");
getJsValue();
getObject();
putValue();
callJsFunction();
}
}

  

JDK1.8中如何用ScriptEngine动态执行JS的更多相关文章

  1. Javascript动态执行JS(new Function与eval比较)

    new Function与eval可以动态执行JS,只要把拼接好的JS方法,然后以字符串的形式传入到这两个函数,可以执行,其中new Function用在模板引擎比较多. 用 Function 类直接 ...

  2. 在Loadrunner中如何用system函数执行系统命令

    前提: windows 系统 实现功能:用 LR 中的system函数执行系统命令 相关功能:在LR中利用C函数建立文件,写文件,读文件. 主要相关函数:sprintf/fopen/fgetc/fre ...

  3. sqlserver 存储过程中拼接sql语句 动态执行

    ALTER PROC [dbo].[Student_Friend_Get] @startRowIndexId INT, @maxNumberRows INT, @schoolId INT, @grad ...

  4. C# 动态执行JS

    有时候需要,在程序中灵活的嵌入自定义的计算逻辑,使用C#加载JS脚本形式可以实现: // 添加引用 using Microsoft.JScript; string jsStr = "var ...

  5. Java8中执行js脚本

    代码中除了callJSFunctionFromFile函数,其他均转载于文章JDK1.8中如何用ScriptEngine动态执行JS import jdk.nashorn.api.scripting. ...

  6. SQL函数中的动态执行语句

    一.为什么要使用动态执行语句? 由于在PL/SQL 块或者存储过程中只支持DML语句及控制流语句,并不支持DDL语句,所以Oracle动态执行语句便应允而生了.关于DDL与DML的区别,请参见:DDL ...

  7. (转+整理)C#中动态执行代码

    通过微软提供的CSharpCodeProvider,CompilerParameters,CompilerResults等类,可以在运行时,动态执行自己写的代码文件.原理就是把你的代码文件动态编译成e ...

  8. winform WebBrowser控件中,cs后台代码执行动态生成的js

    很多文章都是好介绍C# 后台cs和js如何交互,cs调用js方法(js方法必须是页面上存在的,已经定义好的),js调用cs方法, 但如果想用cs里面执行动态生成的js代码,如何实现呢? 思路大致是这样 ...

  9. java中Proxy(代理与动态代理)

    转自: https://blog.csdn.net/pangqiandou/article/details/52964066 一.代理的概念 动态代理技术是整个java技术中最重要的一个技术,它是学习 ...

随机推荐

  1. TestNG参数化测试-数据提供程序 @DataProvider方式

    在 testng.xml 中指定参数可能会有如下的不足: 1.如果你压根不用 testng.xml. 2.你需要传递复杂的参数,或者从Java中创建参数(复杂对象,对象从属性文件或者数据库中读取的et ...

  2. Python 数据共享

    import time from multiprocessing import Process,Manager,Lock # a = 10 # # tmp = a # # tmp -= 1 # # a ...

  3. CSS3一个酷炫的加载效果

    上效果图,用截屏工具制作的,看起来有点卡,在网页上面显示还是不错的. CSS代码: <style type="text/css"> .loader{ position: ...

  4. Python之路PythonThread,第四篇,进程4

    python3  进程/线程4 进程间同步互斥方法: from multiprocessing import Lock 创建 进程锁对象 lock = Lock() lock.acquire()  给 ...

  5. vim 删除

    shift + $ :光标往后 shift + ^ :光标往前 shift + D 删除当前光标直到末尾

  6. [Data Structure] An Algorithm for Matching Delimiters

    An important task when processing arithmetic expressions is to mach delimiters. We can use Stack to ...

  7. Cocos2dx 中的点击事件

    简单记录一下2dx的鼠标交互事件.以及精灵绑定盒的点击判定   Layer 子类的 init方法中:   auto listener = EventListenerTouchOneByOne::cre ...

  8. xdoj--1077: (循环节长度)

    1077: 循环节长度 时间限制: 1 Sec  内存限制: 128 MB提交: 103  解决: 37[提交][状态][讨论版] 题目描述 数一有很多的有理数,然而有的是有限小数,如1/2=0.5, ...

  9. xdoj1194----(bsgs-用数组实现链表 真的是好啊)

    #include <iostream> #include <algorithm> #include <cstdio> #include <cstring> ...

  10. PTA——输出各位数字

    PTA 7-37 输出整数各位数字 方法1: #include <stdio.h> #define N 10000 int main(){ long n, temp; ; scanf(&q ...