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);
  }
} 

同样也会输出相同的结果。

总结

以上就是本文关于Java编程Nashorn实例代码的全部内容,希望对大家有所帮助。感兴趣的朋友可以继续参阅本站其他相关专题,如有不足之处,欢迎留言指出。感谢朋友们对本站的支持!

(0)

相关推荐

  • Java新特性之Nashorn_动力节点Java学院整理

    Nashorn是什么 Nashorn,发音"nass-horn",是德国二战时一个坦克的命名,同时也是java8新一代的javascript引擎--替代老旧,缓慢的Rhino,符合 ECMAScript-262 5.1 版语言规范.你可能想javascript是运行在web浏览器,提供对html各种dom操作,但是Nashorn不支持浏览器DOM的对象.这个需要注意的一个点. 关于Nashorn的入门 主要是两个方面,jjs工具以及javax.script包下面的API: jjs是在j

  • Java用 Rhino/Nashorn 代替第三方 JSON 转换库

    Java 本身就自带 JS 引擎,自从 Java 1.6 开始就支持了,愈来愈好.我对 js 比较熟悉,因此有个大胆的想法,为什么不用自带 js 引擎作 json 转换呢?这样我们可以不用引入其他第三方库. 背景知识:Java 6 提供对执行脚本语言的支持,这个支持来自于 JSR223 规范,对应的包是 javax.script.默认情况下,Java 6 只支持 JavaScript 脚本,它底层的实现是 Mozilla Rhino,它是个纯 Java 的 JavaScript 实现. 除了 O

  • Java编程Nashorn实例代码

    本文研究的主要是Java编程Nashorn的相关内容,具体如下. Nashorn是什么 Nashorn,发音"nass-horn",是德国二战时一个坦克的命名,同时也是java8新一代的javascript引擎--替代老旧,缓慢的Rhino,符合 ECMAScript-262 5.1 版语言规范.你可能想javascript是运行在web浏览器,提供对html各种dom操作,但是Nashorn不支持浏览器DOM的对象.这个需要注意的一个点. 之前学习Java8的时候恰好写了个简单的例子

  • Java编程小实例—数字时钟的实现代码示例

    本文的实例是Java编程实现一个数字时钟,代码测试可用,练练手吧.代码如下: package me.socketthread; import java.awt.Color; import java.awt.Dimension; import java.awt.Font; import java.awt.Graphics; import java.awt.Graphics2D; import java.util.Calendar; import java.util.GregorianCalenda

  • Java回调函数实例代码详解

    首先说说什么叫回调函数? 在WINDOWS中,程序员想让系统DLL调用自己编写的一个方法,于是利用DLL当中回调函数(CALLBACK)的接口来编写程序,使它调用,这个就 称为回调.在调用接口时,需要严格的按照定义的参数和方法调用,并且需要处理函数的异步,否则会导致程序的崩溃. 这样的解释似乎还是比较难懂,这里举个简 单的例子: 程序员A写了一段程序(程序a),其中预留有回调函数接口,并封装好了该程序.程序员B要让a调用自己的程序b中的一个方法,于是,他通过a中的接口回调自己b中的方法.目的达到

  • Java背包问题求解实例代码

    背包问题主要是指一个给定容量的背包.若干具有一定价值和重量的物品,如何选择物品放入背包使物品的价值最大.其中又分01背包和无限背包,这里主要讨论01背包,即每个物品最多放一个.而无限背包可以转化为01背包. 先说一下算法的主要思想,利用动态规划来解决.每次遍历到的第i个物品,根据w[i]和v[i]来确定是否需要将该物品放入背包中.即对于给定的n个物品,设v[i].w[i]分别为第i个物品的价值和重量,C为背包的容量.再令v[i][j]表示在前i个物品中能够装入容量为j的背包中的最大价值.则我们有

  • Java反射机制实例代码分享

    本文旨在对Java反射机制有一个全面的介绍,希望通过本文,大家会对Java反射的相关内容有一个全面的了解. 阅读本文之前,大家可先行参阅<重新理解Java泛型>. 前言 Java反射机制是一个非常强大的功能,在很多大型项目比如Spring, Mybatis都可以看见反射的身影.通过反射机制我们可以在运行期间获取对象的类型信息,利用这一特性我们可以实现工厂模式和代理模式等设计模式,同时也可以解决Java泛型擦除等令人苦恼的问题.本文我们就从实际应用的角度出发,来应用一下Java的反射机制. 反射

  • Java编程复用类代码详解

    本文研究的主要是Java编程中的复用类,那么到底复用类是什么东西,又有什么用法,下面具体介绍. 看了老罗罗升阳的专访,情不自禁地佩服,很年轻,我之前以为和罗永浩一个级别的年龄,也是见过的不是初高中编程的一位大牛之一,专访之后,发现老罗也是一步一个脚印的人.别说什么难做,做不了,你根本就没去尝试,也没有去坚持. If you can't fly then run,if you can't run then walk, if you can't walk then crawl,but whateve

  • Javascript简单实现面向对象编程继承实例代码

    本文讲述了Javascript简单实现面向对象编程继承实例代码.分享给大家供大家参考,具体如下: 面向对象的语言必须具备四个基本特征: 1.封装能力(即允许将基本数据类型的变量或函数放到一个类里,形成类的成员或方法) 2.聚合能力(即允许类里面再包含类,这样可以应付足够复杂的设计) 3.支持继承(父类可以派生出子类,子类拥有父母的属性或方法) 4.支持多态(允许同样的方法名,根据方法签名[即函数的参数]不同,有各自独立的处理方法) 这四个基本属性,javascript都可以支持,所以javasc

  • java图片添加水印实例代码分享

    本文为大家介绍了java图片添加水印实例代码,java实现水印还是非常方便的,水印可以是图片或者文字,具体内容如下 package michael.io.image; import java.awt.AlphaComposite; import java.awt.Graphics2D; import java.awt.Image; import java.awt.RenderingHints; import java.awt.image.BufferedImage; import java.io

  • 详解json string转换为java bean及实例代码

    详解json string转换为java bean及实例代码 pom中添加如下两个库: <dependency> <groupId>org.codehaus.jackson </groupId> <artifactId>jackson-core-asl</artifactId> <version>1.9.2</version> <scope>provided</scope> </depende

  • Java编程泛型限定代码分享

    泛型 一般 出现在集合中,迭代器中 也会出现! 泛型 是为了 提高代码的 安全性. 泛型 确保数据类型的唯一性. 在我们常用的容器中, 越是单一越好处理啊! 泛型的限定: ? 是通配符 指代 任意类型 泛型的限定上限: <? extends E> 接受 E 或者 E 的子类型. 泛型的限定下限: <?  super   E>  接收  E 或者 E 的父类. 泛型的限定上限 (定义父类 填装子类 类型!) 下面我们看看具体代码示例 package newFeatures8; imp

随机推荐