JDK中内嵌JS引擎介绍及使用
原文: JDK中内嵌JS引擎介绍及使用 - Stars-One的杂货小窝
最近研究阅读这个APP,其主要功能就是通过一个个书源,从而实现移动端阅读的体验
比如说某些在线小说阅读网站,会加上相应的广告,从而影响用户阅读体验,于是阅读这个APP就是做了类似净化阅读体验
但是小说阅读网站千千万万,如果去适配每个小说阅读网站,岂不是累死,且作者也会有被发律师函的危险,于是作者提供了对应的工具,允许各位用户可自定义书源,阅读APP则通过导入书源,即可实现对某个小说阅读网站的支持
这里说的书源,实际上就是JS脚本代码,作者本质上是使用了rhino这个Java的JS引擎技术来实现的
介绍
JDK1.6和JDK1.7采用Rhino。Nashorn 支持 ECMAScript 5.1 规范,使用基于 JSR 292 的新语言特性,其中包含在 JDK 7 中引入的 invokedynamic,将 JavaScript 编译成 Java 字节码。
从JDK1.8开始,Java采用Nashorn作为嵌入式 JavaScript 引擎。
本质上,都是通用标准ECMAScriptJS规范,没啥过多的区别
JDK内置的方式,其实也就是将对应JS引擎的jar包一起集成在Java环境里了,如果想使用新版本的JS引擎,可以去对应的JS引擎上找最新版本的jar包或通过maven来引用依赖即可
rhino目前是由火狐浏览器团队开发的,使用Java写的一个JS引擎,目前也是在更新,如果想要更新,而不想更新JDK的话,可以直接使用maven引入最新的jar包即可
Nashorn之前是oracle团队在开发,现在看github的话,是有openjdk团队在维护
而在Android平台方面,由于平台对JVM进行了调整,所以默认是不支持的,但是好消息的是,有大神将移植到了Android平台上,具体可以查看APISENSE/rhino-android,需要的话可以直接引入依赖即可
不过作者写的使用文档不太清晰,这里我比较推荐使用阅读APP开发者的gedoor/rhino-android,实际上也是基于APISENSE/rhino-android进行了一定的调整,使用起来和Java内置的步骤是一样的
可能有同学就有疑惑了,使用这个JS引擎能有什么作用呢?
这里就举个例子,有个加密方法,是通过js去实现的,但是现在如果让我们想要获取到加密的结果,得通过阅读JS源码,看懂加密思路后再使用Java代码重现实现,是不是十分的复杂?
但如果采用JS引擎,我们只需要将对应的JS方法代码拿到,之后我们只需要传参数,通过JS引擎执行加密过程,即可得到加密后的参数了
PS: 最后,注意一下,上述说到的两种JS引擎,只支持部分ES6特性,所有,如果你的JS代码有ES6特性的,可能执行的时候会报错!
下文以JDK8内置的JS引擎为例,讲解一下使用
使用
1.基本使用
首先,我们需要通过ScriptEngineManager对象获取JS脚本引擎engine对象,之后通过engine.eval()方法来执行我们需要的js代码
// 1、获得脚本引擎对象,选择脚本语言
val manager = ScriptEngineManager()
// 亦可以是js缩写,代表JavaScript脚本语言
val engine = manager.getEngineByName("js")
val result = engine.eval("""
var num = 5+2;
num
""".trimIndent())
println(result)
PS: 如果是
gedoor/rhino-android,getEngineByName()方法里面传rhino这个字符串!
2.获取JS变量数值
比较多的情况就是,我们需要通过JS去执行逻辑,之后得到返回的结果,有以下2种方式获取数值
- 通过eval()方法的返回值(如上面基本使用的示例代码),可以理解为在浏览器的控制台执行js代码后的控制台会输出的数值
- 通过作用域变量
作用域变量的方式代码如下:
// 1、获得脚本引擎对象,选择脚本语言
val manager = ScriptEngineManager()
// 亦可以是js缩写,代表JavaScript脚本语言
val engine = manager.getEngineByName("js")
//声明一个变量
engine.put("finalResult","")
//注册一个js方法
engine.eval("""
function add(a,b){
return a + b
}
""".trimIndent())
//执行获取结果,赋予finalResult数据
engine.eval("finalResult = add(2,3)")
println(engine["finalResult"])
或者直接在js中声明变量finalResult,如下代码:
// 1、获得脚本引擎对象,选择脚本语言
val manager = ScriptEngineManager()
// 亦可以是js缩写,代表JavaScript脚本语言
val engine = manager.getEngineByName("js")
//注册一个js方法
engine.eval("""
function add(a,b){
return a + b
}
""".trimIndent())
//执行获取结果
engine.eval("var finalResult = add(2,3)")
println(engine["finalResult"])
3.JS使用Java类型数值
// 1、获得脚本引擎对象,选择脚本语言
val manager = ScriptEngineManager()
// 亦可以是js缩写,代表JavaScript脚本语言
val engine = manager.getEngineByName("js")
val file = File("D:\\temp\\qrcode.gif")
//将文件的对象设置为JS变量
engine.put("myFile",file)
//注册一个js方法
engine.eval("""
print(myFile.getPath());
""".trimIndent())
上面js中的print实际上也是Java提供的方法,而myFile则是我们Java中的一个File对象,JS代码中可以使用这个对象及相应的Java方法
参考
- JAVA使用ScriptEngine 解析脚本_雪_糕的博客-CSDN博客
- JavaScript脚本引擎Rhino_唯有一片炙热的博客-CSDN博客_rhino引擎
- 初探Java Nashorn脚本引擎_软件开发随心记的博客-CSDN博客_nashorn引擎
- mozilla/rhino: Rhino is an open-source implementation of JavaScript written entirely in Java
- openjdk/nashorn: https://openjdk.org/projects/nashorn
- nashorn官方使用文档API
JDK中内嵌JS引擎介绍及使用的更多相关文章
- 【转】WebResource实现在自定义控件中内嵌JS文件
在类库中的资源 其他项目中要使用 需要嵌入才行 参考文献:WebResource实现在自定义控件中内嵌JS文件 1. WebResource简介 ASP.NET(1.0/1.1)给我们提供了一个开发 ...
- 『Asp.Net 组件』Asp.Net 服务器组件 内嵌JS:让自己的控件动起来
代码: using System; using System.Web; using System.Web.UI; using System.Web.UI.WebControls; namespace ...
- APP中内嵌H5页面为什么不能下载?
在APP中内嵌H5页面,若页面上存在下载链接,没有任何反应,为什么呢? 原因是app中内嵌的H5页面是WebView解析的,什么是WebView呢? 在Android手机中内置了一款高性能webkit ...
- Unity中内嵌网页插件UniWebView
一.常见Unity中内嵌网页实现方式: 1.UnityWebCore只支持windows 2.Unity-Webview支持Android,IOS 3.UniWebView支持mac os,Andro ...
- Winform/WPF中内嵌BeetleX的HTTP服务
在新版本的BeetleX.FastHttpApi加入了对netstandard2.0支持,如果程序基于.NetFramework4.6.1来构建WinForm或WPF桌面程序的情况下可以直接把Beet ...
- Linux内核--C语言中内嵌汇编 asm __volatile__
在内嵌汇编中,可以将C语言表达式指定为汇编指令的操作数,而且不用去管如何将C语言表达式的值读入哪个寄存器,以及如何将计算结果写回C 变量,你只要告诉程序中C语言表达式与汇编指令操作数之间的对应关系即可 ...
- Linux内核系列—C语言中内嵌汇编 asm __volatile__,asm__volatile_【转】
转自:http://www.bkjia.com/Androidjc/1109412.html 在内嵌汇编中,可以将C语言表达式指定为汇编指令的操作数,而且不用去管如何将C语言表达式的值读入哪个寄存器, ...
- Web网页中内嵌Activex的Activex插件开发 .
转载自: http://blog.csdn.net/tttyd/article/details/5258096 源代码下载 http://files.cnblogs.com/tttyd/Activex ...
- GCC在C语言中内嵌汇编 asm __volatile__ 【转】
转自:http://blog.csdn.net/pbymw8iwm/article/details/8227839 在内嵌汇编中,可以将C语言表达式指定为汇编指令的操作数,而且不用去管如何将C语言表达 ...
- GCC在C语言中内嵌汇编 asm __volatile__
2012-11-26 22:20 17958人阅读 评论(2) 收藏 举报 分类: linux(59) 架构管理(24) C/C++(59) 目录(?)[+] 在内嵌汇编中,可以将C语言表达式 ...
随机推荐
- Apache开启目录浏览功能的正确姿势
部分代码是抄的网友的,哪儿抄的忘了,我是自己修改了点,并非我本人原创,觉得侵权联系我,立马删 在宝塔面板中,打开网站的设置,在配置文件那里添加如下内容 Directory "文件绝对路径&q ...
- Elasticsearch:Pinyin 分词器
Elastic的Medcl提供了一种搜索Pinyin搜索的方法.拼音搜索在很多的应用场景中都有被用到.比如在百度搜索中,我们使用拼音就可以出现汉字: 对于我们中国人来说,拼音搜索也是非常直接的.那么在 ...
- centos使用Yum安装postgresql 13
rpm源安装 yum install -y https://download.postgresql.org/pub/repos/yum/reporpms/EL-7-x86_64/pgdg-redhat ...
- windows系统下使用bat脚本文件设置 JDK 系统环境变量
号开头的行不要写在bat文件中 # java_init.bat # 注意文件换行符是windows系统下的(CR LF),文件编码是ANSI # path变量追加这个可以拓展到tomcat,mysql ...
- jmeter录制登录脚本
1.添加代理服务器 在非测试元件添加http代理服务器,端口写8888,域写127.0.0.1 在排除模式里填入.*.(js|css|PNG|jpg|ico|png|gif|woff|ttf).* 2 ...
- KNN算法介绍及源码实现
一.KNN算法介绍 邻近算法,或者说K最邻近(KNN,K-NearestNeighbor)分类算法是数据挖掘分类技术中最简单的方法之一.所谓K最近邻,就是K个最近的邻居的意思,说的是每个样本都可以用它 ...
- [CG从零开始] 6. 加载一个柴犬模型学习UV贴图
在第 5 篇文章中,我们成功加载了 fbx 模型,并且做了 MVP 变换,将立方体按照透视投影渲染了出来.但是当时只是随机给顶点颜色,并且默认 fbx 文件里只有一个 mesh,这次我们来加载一个柴犬 ...
- 小程序 wx.navigateTo和 wx.redirectTo区别
wx.navigateTo 官方解释: 意思就是说. A页面跳转B页面 B页面做了操作,点击保存,再跳转回A页面 此时,如果点击左上返回按钮,仍然可以跳转回B页面,而且里面的数据是操作之前的数据 wx ...
- cordon节点,drain驱逐节点,delete 节点
目录 一.系统环境 二.前言 三.cordon节点 3.1 cordon节点概览 3.2 cordon节点 3.3 uncordon节点 四.drain节点 4.1 drain节点概览 4.2 dra ...
- linux 2021
常用安装 sudo apt install openssh-server # 安装ssh service ssh # 查看ssh服务的 基础 Debian 是Ubuntu的母板,有强大的包管理功能,使 ...