Java编程Nashorn实例代码
作者:CrazeBean 发布时间:2022-07-30 05:28:21
标签:java,nashorn,新特性
本文研究的主要是Java编程Nashorn的相关内容,具体如下。
Nashorn是什么
Nashorn,发音“nass-horn”,是德国二战时一个坦克的命名,同时也是java8新一代的javascript引擎--替代老旧,缓慢的Rhino,符合 ECMAScript-262 5.1 版语言规范。你可能想javascript是运行在web浏览器,提供对html各种dom操作,但是Nashorn不支持浏览器DOM的对象。这个需要注意的一个点。
之前学习Java8的时候恰好写了个简单的例子,所以放在这里记录一下。
文件目录:
StringFunction.java,字符串功能类
StringNashorn.java,封装脚本引擎
NashornTest.java,测试引擎,引擎调用
StringFunction.java源码:
public class StringFunction {
/**
* 字符串截取
*/
public String sub(String str, int start, int end) {
return str.substring(start, end);
}
/**
* 字符串拼接
*/
public String append(String... strs) {
StringBuilder result = new StringBuilder(strs[0]);
Stream.of(strs).skip(1).forEach(str -> result.append(str));
return result.toString();
}
}
StringNashorn.java源码:
public class StringNashorn {
/**
* Nashorn脚本引擎
*/
private ScriptEngine nashorn = new ScriptEngineManager().getEngineByName("nashorn");
/**
* 执行脚本
*/
public Object execute(String script) {
ScriptContext scriptContext = new SimpleScriptContext();
// 定义一个名为stringfunction的函数,这个函数实际对应着一个StringFunction对象
scriptContext.setAttribute("stringfunction", new StringFunction(), 100);
nashorn.setContext(scriptContext);
Object result = null;
try {
result = nashorn.eval(script);
} catch (ScriptException e) {
e.printStackTrace();
}
return result;
}
}
NashornTest.java源码:
public class NashornTest {
public static void main(String[] args) {
String substring = "stringfunction.sub(\"abcdefghijk\", 1, 4);";
String append = "stringfunction.append(\"abc\", \"def\");";
StringNashorn nashorn = new StringNashorn();
Object subResult = nashorn.execute(substring);
Object appendResult = nashorn.execute(append);
System.out.println(subResult.toString());
System.out.println(appendResult.toString());
}
}
运行main方法,运行结果:
bcd
abcdef
这里如果NashornTest.java改写如下:
public class NashornTest {
public static void main(String[] args) {
// 脚本内用对象接收结果并打印
String substring = "var s1 = stringfunction.sub(\"abcdefghijk\", 1, 4);"
+ " print(s1);";
String append = "var s2 = stringfunction.append(\"abc\", \"def\");"
+ " print(s2);";
StringNashorn nashorn = new StringNashorn();
// 这里execute不再返回对象,因为在脚本里面已经有对象接收sub和append的执行结果。
nashorn.execute(substring);
nashorn.execute(append);
}
}
同样也会输出相同的结果。
来源:http://blog.csdn.net/u010429286/article/details/78951707


猜你喜欢
- 简述最近做的公司项目,图片比较多,不想给其存储到自己服务器上,就买了阿里云的OSS服务器来哦进行存储,其实集成第三方平台,一般没什么难度,当
- android 实现拨打电话的app,代码非常简单,功能也很实用,分享给大家。MainActivity.javapackage com.bb
- 一、Unity Shader基础1、创建和使用Shader在Unity中Shader一般由两种用途:指定给材质,用于物理渲染;指定给脚本,用
- 开发前准备支付宝开发平台.支付宝沙箱环境申请使用!!!重点 授权回调地址必须要写全路径也就是controller最终路径(下面有具体细节)R
- 堆排序是一种树形选择排序方法,它的特点是:在排序的过程中,将array[0,...,n-1]看成是一颗完全二叉树的顺序存储结构,利用完全二叉
- 问题描述:由于在使用SQL查询大量的数据并一次显示到dataGridView控件,出现拖拉的时候卡顿。解决方法:1.首先分页。2.其次把显示
- 本文实例为大家分享了Unity UI实现拖拽旋转的具体代码,供大家参考,具体内容如下跟随鼠标旋转第一种效果是跟随鼠标旋转,原理是计算下鼠标位
- 1. 下载Tomcat首先,下载Apache Tomcat并解压到本地计算机,可存放于任何位置。另外,需要在系统中环境JRE_H
- Android系统对所有的危险权限进行了分组,称为 权限组 。属于同一组的危险权限将自动合并授予,用户授予应用某个权限组的权限,则应用将获得
- C#中+=是什么意思在C#中, "+="有两种运用场合。第一种,用在数值后面作为逻辑运算符,自加变量,如:int i=0
- 异步操作C++11为异步操作提供了4个接口std::future : 异步指向某个任务,然后通过future特性去获取任务函数的返回结果。s
- 手动将本地jar添加到Maven仓库将jar添加到本地仓库的做法以下面pom.xml依赖的jar包为例:实际项目中pom.xml依赖写法:&
- 目标效果: 点击动画按钮之后每张牌各自旋转 散开到屏幕上半部分的任意位置之后回到初始位置 比较像LOL男刀的技能动画 : )1: 创建卡牌对
- 接口等幂性通俗的来说就是同一时间内,发起多次请求只有一次请求成功;其目的时防止多次提交,数据重复入库,表单验证网络延迟重复提交等问题。比如:
- 本文实例讲述了Java实现的计算最大下标距离算法。分享给大家供大家参考,具体如下:题目描述给定一个整形数组,找出最大下标距离j−i, 当且A
- 场景随着移动支付的兴起,在我们的app'中,会经常有集成支付的需求.这时候一般都会采用微信和支付宝的sdk 来集成(一)支付宝支付在
- 一、template下文件不允许直接访问1、查资料得知:springboot项目默认是不允许直接访问template下的文件的,是受保护的。
- 一、对Canvas进行操作对Canvas的一系列操作,是指对Canvas进行旋转、平移、缩放等操作。这些操作可以让Canvas对象使用起来更
- 问题:在Spring Boot中使用JpaRepository的deleteById(ID id)方法删除数据时,首先要使用existsBy
- 在Android系统中,长按Power键默认会弹出对话框让你选择“飞行模式”,“静音”,“关机”等功能。这些功能对于手机非常适用,但是对于机