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

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();}
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52
  • 53
  • 54
  • 55
  • 56
  • 57
  • 58
  • 59
  • 60
  • 61
  • 62
  • 63
  • 64
  • 65
  • 66
  • 67
  • 68
  • 69
  • 70
  • 71
  • 72
  • 73
  • 74
  • 75
  • 76
  • 77
  • 78
  • 79
  • 80
  • 81
  • 82
  • 83
  • 84
  • 85
  • 86
  • 87
  • 88
  • 89

是不是很有趣呢,注意的是ScriptObjectMirror类上市jdk1.8的类,该类对于先前版本的相应类进行了封装,使得代码很简单了。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/387207.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

数据结构06树和二叉树

第六章 树和二叉树 6.1 树的定义和基本术语 树 Tree 是n个结点的有限集。 任意一棵非空树中&#xff1a; &#xff08;1&#xff09;有且仅有一个特定的称为根&#xff08;root&#xff09;的结点&#xff1b; &#xff08;2&#xff09;当n>1时&#xff0c;其余结点可…

2019.03.20 mvt,Django分页

MVT模式 MVT各部分的功能: M全拼为Model&#xff0c;与MVC中的M功能相同&#xff0c;负责和数据库交互&#xff0c;进行数据处理。 V全拼为View&#xff0c;与MVC中的C功能相同&#xff0c;接收请求&#xff0c;进行业务处理&#xff0c;返回响应。 T全拼为Tem…

CountDownLatch,CyclicBarrier和Semaphore

在java 1.5中&#xff0c;提供了一些非常有用的辅助类来帮助我们进行并发编程&#xff0c;比如CountDownLatch&#xff0c;CyclicBarrier和Semaphore&#xff0c;今天我们就来学习一下这三个辅助类的用法。以下是本文目录大纲&#xff1a;一.CountDownLatch用法二.CyclicBarrie…

数据结构07排序

第十章内部排序 10.1 概述 排序就是把一组数据按关键字的大小有规律地排列。经过排序的数据更易于查找。 排序前KiKj&#xff0c;且Ki在前: 排序方法是稳定的&#xff0c;若排序后Ki在前&#xff1b; 排序方法是不稳定的&#xff0c;如排序后Kj在前。 分类&#xff1a; 内…

数据结构08查找

第九章 查找 另一种在实际应用中大量使用的数据结构--查找表。 所谓查找&#xff0c;即为在一个含有众多的数据元素的查找表中找出某个“特定的”数据元素。 查找表 search table 是由同一类型的数据元素构成的集合。集合中的数据元素之间存在着完全松散的关系&#xff0c;故…

下载Centos7 64位镜像

下载Centos7 64位镜像 1.打开Centos官网 打开Centos官方网站地址&#xff1a;https://www.centos.org/&#xff0c;点击Get CentOS Now 2.点击Minimal ISO镜像 Minimal ISO镜像&#xff0c;与DVD ISO镜像的差别有很多&#xff0c;这里只说两点 1.Minimal ISO类似于Windows的纯净…

[Objective-C语言教程]结构体(17)

Objective-C数组可定义包含多个相同类型的数据项的变量类型&#xff0c;但结构体是Objective-C编程中的另一个用户定义数据类型&#xff0c;它可组合不同类型的数据项。 结构体用于表示记录&#xff0c;假设要图书馆中跟踪书籍信息。可能希望跟踪每本书的以下属性 - 标题作者学…

Scala01入门

第1章 可伸展的语言 Scala应用范围广&#xff0c;从编写脚本&#xff0c;到建立大型系统。 运行在标准Java平台上&#xff0c;与Java库无缝交互。 更能发挥力量的地方&#xff1a;建立大型系统或可重用控件的架构。 将面向对象和函数式编程加入到静态类型语言。 在Scala中&a…

架构师之路17年精选80篇

【架构必备】 《互联网架构如何实现“高并发”》4W 《TCP接入层的负载均衡、高可用、扩展性架构设计》2.2W 《配置中心架构设计演进》1.7W 《跨公网调用的大坑与架构优化》1.4W 《DNS在架构设计中的巧用》1.9W 《消息如何在网络上安全传输》1.2W 《10W定时任务&#xff0c;如何…

iphone手机型号获取

#import <sys/utsname.h> //手机型号 NSString *device [self iphoneType]; (NSString *)iphoneType { struct utsname systemInfo; uname(&systemInfo); NSString *platform [NSString stringWithCString:systemInfo.machine encoding:NSUTF8StringEncoding]; if…

Java网络01基本网络概念

协议 Protocol&#xff1a;明确规则 &#xff08;1&#xff09;地址格式&#xff1b; &#xff08;2&#xff09;数据如何分包&#xff1b; ... TCP/IP四层模型&#xff1a; 应用层 HTTP SMTP POP IMAP 传输层 TCP UDP 网际层 IP 主机网络层 host to host layer 数模、…

apache的产品分类说明

分类 项目名 说明 开发语言 服务器&#xff08;共20&#xff09; Apache HTTP Server全球第一HTTP服务器C/CTomcatJava的Web服务器JavaJames邮件服务器JavaSpamAssassin反垃圾邮件C/CPerlApache的Perl编程语言支持C/CTclTCL脚本语言C/CDirectory Server超级目录服务器JavaAxisW…

Java网络02基本Web概念

URI Uniform Resource Identifier 同一资源标识符 以特定语法标识一个资源的字符串 绝对URI&#xff1a;URI模式模式特有部分 scheme:scheme-specific-part scheme分为&#xff1a; data file本地文件系统 ftp http telnet urn 统一资源名 scheme-specific-part为&am…

解决自建ca认证后浏览器警告

前一篇讲解了基本的建立证书的过程&#xff0c;但是建立后总是会在浏览器那里警告&#xff1a; 此链接不是私密链接 --谷歌浏览器 此证书颁发机构不可信 此证书不是这个网站的 --ie浏览器 总之证书是生成成功了&#xff0c;但是其中的内容填写错误了&a…

设计模式学习(三)——单例模式

在Java开发过程中&#xff0c;很多场景下都会碰到或要用到单例模式&#xff0c;在设计模式里也是经常作为指导学习的热门模式之一&#xff0c;相信每位开发童鞋都用到过。我们总是沿着前辈的足迹去做设定好的思路&#xff0c;往往没去探究为何这么做&#xff0c;所以这篇文章对…

Java网络03流

网络程序所做的很大一部分工作只是输入和输出&#xff1a;从一个系统向另一个系统移动数据。 输出流 Java的基本输出流类是java.io.OutputStream: public abstract class OutputStream 这个类提供了写入数据所需的基本方法&#xff0c;包括&#xff1a; public abstract vo…

基于微信小程序开发的仿微信demo

(本文参考自github/liujians,地址:https://github.com/liujians/weApp) 作者声明&#xff1a; 基于微信小程序开发的仿微信demo 整合了ionic的样式库和weui的样式库 使用请查看使用必读! 更新日志请点击这里 目前功能 查看消息 网络请求获取数据&#xff08;download示例server…

设计模式之六大原则

设计模式之设计原则 这软件设计过程中&#xff0c;有六大设计原则&#xff1a; 单一职责原则里氏替换原则依赖倒置原则接口隔离原则迪米特法则开闭原则由于软件开发过程中&#xff0c;根据业务不同等因素形成了各种复杂的而不可预料的需求&#xff0c;遵守原则&#xff0c;让项…

安装配置tengine

安装tengine 1、依赖gcc openssl-devel pcre-devel zlib-devel 安装&#xff1a;yum install gcc openssl-devel pcre-devel zlib-devel 2、解压tengine压缩包&#xff0c;并进入目录&#xff1b; 3、./configure --prefix/usr/tengine 4、make && make install 5…

使用springboot集成jseesite

请访问 开源中国下的https://git.oschina.net/wolfking/wolfking-jeesitehttps://www.oschina.net/p/wolfking-jeesite?fromerr6Iie3qZt 下载源码&#xff0c;按照如下的运行使用 springboot 改造 jeesite&#xff0c;只保留最简单的系统配置 。 介绍 1、运行主类&#xff0c;…