最近项目需要,利用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代码相关推荐

  1. Nashorn——在JDK 8中融合Java与JavaScript之力--转

    原文地址:http://www.infoq.com/cn/articles/nashorn 从JDK 6开始,Java就已经捆绑了JavaScript引擎,该引擎基于Mozilla的Rhino.该特性 ...

  2. java执行JavaScript代码

    java执行JavaScript代码的方式有很多,这里讲一下使用 Mozilla 公司开发的 Rhino 实现的,该实现从 1.6开始集成到 jdk里面. 1,对象相互转化 // 获取引擎对象    ...

  3. java 代码压缩javascript_通过Java压缩JavaScript代码实例分享

    通过移除空行和注释来压缩 javascript 代码 /** * this file is part of the echo web application framework (hereinafte ...

  4. java调用wcf_详解JAVA调用WCF服务的示例代码

    这一篇将要解决java中调用WCF的问题,使用的依旧是上一篇中托管在IIS中的WCF服务,本来我是打算用axis来写这篇文章的,可就在我开始之前,无意中发现了在java包中自带的wsimport工具 ...

  5. java调用exe_Windows系统中Java调用cmd命令及执行exe程序的方法

    Java调用cmd命令,并输出显示信息: package com.anxin.cmd.test; import java.io.BufferedReader; import java.io.Input ...

  6. java 怎么调用clojure_如何从Java调用Clojure宏?

    有没有从 Java调用Clojure宏? 这是我正在努力做的: RT.var("clojure.core","require").invoke(Symbol.c ...

  7. Java调用动态库 缺点,Java调用动态库所需要关心的有关问题

    Java调用动态库所需要关心的问题 标签: 无标签 利用JNative实现Java调用动态库(转) http://cctv663.blog.163.com/blog/static/1011921220 ...

  8. java dll 调用方法_关于Java调用dll的方法 | 学步园

    Java语言本身具有跨平台性,如果通过Java调用DLL的技术方便易用,使用Java开发前台界面可以更快速,也能带来跨平台性. Java调用C/C   写好的DLL库时,由于基本数据类型不同.使用字节 ...

  9. java调用批处理文件_有关java调用批处理文件

    1 例子 java调用批处理文件 public classRunJarBat {public static voidrunJarBat() {//调用控制台 Runtime rt =Runtime.g ...

最新文章

  1. VS2015下使用websocketpp和asio构建websock服务器
  2. JQuery中的html(),text(),val()区别
  3. d3 i5 神舟精盾k480n_神舟精盾k480n i5 d3和精盾i5 d1哪个好?
  4. 启动FastDFS服务,使用python客户端对接fastdfs完成上传测试
  5. Jlink--SWD脚位连接
  6. html session登陆验证,原创 实现session登陆时间的验证,验证用户登录页面的一个监听器...
  7. redis数据类型 - Hash类型
  8. 解决beego中同时开启http和https时,https端口占用问题
  9. Ceph性能调优和建议
  10. android python .xlsx_python读写xlsx
  11. c语言全局变量(c语言全局变量怎么定义)
  12. 大数据定价方法的国内外研究综述及对比分析
  13. python+nodejs+vue自驾游旅游网站系统
  14. 运行zookeeper提供者报错:org.jboss.netty.util.internal.jzlib.ZStream scanned from multiple locations: jar:
  15. 关于sungard和博彦的笔试
  16. html微信图片自适应,微信小程序实现图片高度自适应
  17. MachineLearning 1. 主成分分析(PCA)
  18. java时间格式大全
  19. CSS制作鼠标移上去,三角形(箭头)旋转
  20. 我自己下班回家赚钱的3个方式

热门文章

  1. Cad二次开发绘图1
  2. 【机器学习】误差、过拟合与欠拟合
  3. 面试题:如何解决欠拟合
  4. 2022年北京理工大学计算机考研复试时间与安排
  5. android数据漫游,测量Android上的数据漫游流量?
  6. 【生成任务下推生成子工序生产计划,无法结单】
  7. mongoDB的三种基础备份方法
  8. Robust Simulation of Small-Scale Thin Features in SPH-based Free Surface Flows
  9. ChatGPT做PPT方案,10组提示词方案!
  10. bowtie2序列比对