nashorn js 调用 java_Java8 Nashorn实现Java调用javascript代码
最近项目需要,利用java执行动态语言,首先想到的是支持js。
1.从打印Hello World开始
Java8 引入Nashorn实现javascript调用,比如使用java运行一段js实现“Hello World”打印:
package com.iflytek.research.jsdemo;
import javax.script.ScriptEngine;
import javax.script.ScriptEngineManager;
import javax.script.ScriptException;
public class NashornTest {
public static void main(String[] args) {
// 加载nashorn执行引擎
ScriptEngine engine = new ScriptEngineManager().getEngineByName("nashorn");
try {
engine.eval("var str = 'Hello World';"
+ "print(str);");
} catch (ScriptException e) {
e.printStackTrace();
}
}
}
上述代码成功打印了“Hello World”, 现实场景中,script代码大多来自文件,编辑test.js
var str = 'Hello World';
print(str);
将java读取方式改为从文件加载
// 加载nashorn执行引擎
ScriptEngine engine = new ScriptEngineManager().getEngineByName("nashorn");
try {
FileReader scriptFile = new FileReader("test.js");
engine.eval(scriptFile);
} catch (ScriptException e) {
e.printStackTrace();
} catch (FileNotFoundException e) {
e.printStackTrace();
}
运行后,仍然能正常打印
2.传递参数给javascript代码
可以使用SimpleBindings类来实现参数传递,改写test.js
var str = 'Hello ';
print(str + name);
上述代码name变量就可以使用SimpleBindings来传递,具体实现
// 加载nashorn执行引擎
ScriptEngine engine = new ScriptEngineManager().getEngineByName("nashorn");
try {
FileReader scriptFile = new FileReader("test.js");
SimpleBindings simpleBindings = new SimpleBindings();
simpleBindings.put("name", "Nashorn");
engine.eval(scriptFile, simpleBindings);
} catch (ScriptException e) {
e.printStackTrace();
} catch (FileNotFoundException e) {
e.printStackTrace();
}
再次运行代码 打印
Hello Nashorn
这个参数在js中是全局可见的,比如将它放到函数作用域中也可以正常读取到
var good = function() {
return name + ' is Good';
}
print(good());
打印结果
Nashorn is Good
3.指定调用的函数
在加载js文件后,可以使用Invocable接口的invokeFunction方法, 修改js文件
var good = function(name) {
print(name + ' is Good');
}
在给函数传参直接在invokeFunction方法添加参数即可,不再需要使用SimpleBindings
public static void main(String[] args) {
// 加载nashorn执行引擎
ScriptEngine engine = new ScriptEngineManager().getEngineByName("nashorn");
try {
FileReader scriptFile = new FileReader("test.js");
engine.eval(scriptFile);
Invocable in = (Invocable) engine;
in.invokeFunction("good","Nashorn");
} catch (ScriptException e) {
e.printStackTrace();
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (NoSuchMethodException e) {
e.printStackTrace();
}
}
如果要传递对象也是妥妥的
var good = function(person) {
print( 'name: ' + person.name);
}
Map person = new HashMap<>();
person.put("name", "nashorn");
in.invokeFunction("good",person);
4.获取js返回值
同样调用invokeFunction
test.js
var getPerson = function() {
var person = {
name : "Zhan San",
age: 18
}
return person;
}
public static void main(String[] args) {
// 加载nashorn执行引擎
ScriptEngine engine = new ScriptEngineManager().getEngineByName("nashorn");
try {
FileReader scriptFile = new FileReader("test.js");
engine.eval(scriptFile);
Invocable in = (Invocable) engine;
JSONObject personJson =(JSONObject)JSONObject.toJSON(in.invokeFunction("getPerson"));
System.out.println(personJson.toJSONString());
} catch (ScriptException e) {
e.printStackTrace();
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (NoSuchMethodException e) {
e.printStackTrace();
}
}
这里json引用了fastjson包,执行之后获得结果
{"name":"Zhan San","age":18}
nashorn js 调用 java_Java8 Nashorn实现Java调用javascript代码相关推荐
- Nashorn——在JDK 8中融合Java与JavaScript之力--转
原文地址:http://www.infoq.com/cn/articles/nashorn 从JDK 6开始,Java就已经捆绑了JavaScript引擎,该引擎基于Mozilla的Rhino.该特性 ...
- java执行JavaScript代码
java执行JavaScript代码的方式有很多,这里讲一下使用 Mozilla 公司开发的 Rhino 实现的,该实现从 1.6开始集成到 jdk里面. 1,对象相互转化 // 获取引擎对象 ...
- java 代码压缩javascript_通过Java压缩JavaScript代码实例分享
通过移除空行和注释来压缩 javascript 代码 /** * this file is part of the echo web application framework (hereinafte ...
- java调用wcf_详解JAVA调用WCF服务的示例代码
这一篇将要解决java中调用WCF的问题,使用的依旧是上一篇中托管在IIS中的WCF服务,本来我是打算用axis来写这篇文章的,可就在我开始之前,无意中发现了在java包中自带的wsimport工具 ...
- java调用exe_Windows系统中Java调用cmd命令及执行exe程序的方法
Java调用cmd命令,并输出显示信息: package com.anxin.cmd.test; import java.io.BufferedReader; import java.io.Input ...
- java 怎么调用clojure_如何从Java调用Clojure宏?
有没有从 Java调用Clojure宏? 这是我正在努力做的: RT.var("clojure.core","require").invoke(Symbol.c ...
- Java调用动态库 缺点,Java调用动态库所需要关心的有关问题
Java调用动态库所需要关心的问题 标签: 无标签 利用JNative实现Java调用动态库(转) http://cctv663.blog.163.com/blog/static/1011921220 ...
- java dll 调用方法_关于Java调用dll的方法 | 学步园
Java语言本身具有跨平台性,如果通过Java调用DLL的技术方便易用,使用Java开发前台界面可以更快速,也能带来跨平台性. Java调用C/C 写好的DLL库时,由于基本数据类型不同.使用字节 ...
- java调用批处理文件_有关java调用批处理文件
1 例子 java调用批处理文件 public classRunJarBat {public static voidrunJarBat() {//调用控制台 Runtime rt =Runtime.g ...
最新文章
- VS2015下使用websocketpp和asio构建websock服务器
- JQuery中的html(),text(),val()区别
- d3 i5 神舟精盾k480n_神舟精盾k480n i5 d3和精盾i5 d1哪个好?
- 启动FastDFS服务,使用python客户端对接fastdfs完成上传测试
- Jlink--SWD脚位连接
- html session登陆验证,原创 实现session登陆时间的验证,验证用户登录页面的一个监听器...
- redis数据类型 - Hash类型
- 解决beego中同时开启http和https时,https端口占用问题
- Ceph性能调优和建议
- android python .xlsx_python读写xlsx
- c语言全局变量(c语言全局变量怎么定义)
- 大数据定价方法的国内外研究综述及对比分析
- python+nodejs+vue自驾游旅游网站系统
- 运行zookeeper提供者报错:org.jboss.netty.util.internal.jzlib.ZStream scanned from multiple locations: jar:
- 关于sungard和博彦的笔试
- html微信图片自适应,微信小程序实现图片高度自适应
- MachineLearning 1. 主成分分析(PCA)
- java时间格式大全
- CSS制作鼠标移上去,三角形(箭头)旋转
- 我自己下班回家赚钱的3个方式