GVKun编程网logo

Java 7下的Nashorn(java 7z)

14

如果您对Java7下的Nashorn和java7z感兴趣,那么这篇文章一定是您不可错过的。我们将详细讲解Java7下的Nashorn的各种细节,并对java7z进行深入的分析,此外还有关于2020年第

如果您对Java 7下的Nashornjava 7z感兴趣,那么这篇文章一定是您不可错过的。我们将详细讲解Java 7下的Nashorn的各种细节,并对java 7z进行深入的分析,此外还有关于2020 年第一个候选 Java 增强提案,删除 Nashorn JavaScript 引擎、Java 8 Nashorn 引擎、Java 8 新特性-菜鸟教程 (7) -Java 8 Nashorn JavaScript、Java 8 新特性探究(十二)Nashorn :新犀牛的实用技巧。

本文目录一览:

Java 7下的Nashorn(java 7z)

Java 7下的Nashorn(java 7z)

我正在尝试使Oracle的Nashorn在Java 7下运行。

我已经克隆了仓库并编译了源代码。我要做的就是将其编译为:

  • 将jdk.internal.org.objectweb.asm。更改为org.objectweb.asm。
  • 更改具有Long.hashCode()静态的一行。

一切似乎都很高兴,Java 7将Nashorn视为脚本引擎。但是当我尝试获取实例时:

NashornScriptEngineFactory factory = new NashornScriptEngineFactory();ScriptEngine engine = factory.getScriptEngine();

我得到例外:

java.lang.RuntimeException:java.lang.ClassNotFoundException:jdk.nashorn.internal.objects.Global在jdk.nashorn.internal.runtime.Context.newGlobalTrusted(Context.java:831)在jdk.nashorn.internal.runtime.Context
.newGlobal(Context.java:636)位于jdk.nashorn.api.scripting.NashornScriptEngine
$
2.run(NashornScriptEngine.java:270)位于jdk.nashorn.api.scripting.NashornScriptEngine
$
2.run(NashornScriptEngine.java:266)位于jdk.nashorn.api.scripting.NashornScriptEngine。(NashornScriptEngine.java:104)上的jdk.nashorn.api.scripting.NashornScriptEngine。(NashornScriptEngine.java:104)上的jdk.nashorn.api.scripting.NashornScriptEngine.createNashornGlobal(NashornScriptEngine.java:266)上的java.security.AccessController.doPrivileged(本机方法)
.nashorn.api.scripting.NashornScriptEngine。(NashornScriptEngine.java:78),位于jdk.nashorn.api.scripting.NashornScriptEngineFactory。getScriptEngine(NashornScriptEngineFactory.java:139)

jdk.nashorn.internal.objects.Global在我的课堂上。Nashorn可能会使用其他类加载器吗?

答案1

小编典典

我曾尝试让它在7以下运行,但遇到与您相同的错误。我认为这与Nashorn利用Java 8中的一些新功能有关。

有一个反向移植犀牛的对到位桶JDK 7;
我写了一篇博客文章中详细介绍了如何使用它在我的博客作品在这里。

该bitbucket项目已经有一段时间没有更新了,如果您想与Nashorn一起玩,我建议您使用Java
8的预览版。

2020 年第一个候选 Java 增强提案,删除 Nashorn JavaScript 引擎

2020 年第一个候选 Java 增强提案,删除 Nashorn JavaScript 引擎

Oracle 软件研发总监 Jim Laskey 提出了一项候选 Java 增强提案(JEP),要删除长期以来一直使用的 Nashorn JavaScript 引擎、相关 API 和jjs工具。这是 2020 年第一个进入候选名单的 JEP,并且比较成熟,有望在 JDK 15 中实施。

编号 JEP 372,该提案表示:Nashorn JavaScript 引擎最初通过 JEP 174 集成到 JDK 8 中,用以替代 Rhino 脚本引擎。当时它是 ECMAScript-262 5.1 标准的完整实现。但随着 ECMAScript 语言构造以及 API 的快速适应和修改,我们发现 Nashorn 难以维护。

根据该提议,两个 JDK 模块将被永久删除:

  • jdk.scripting.nashorn:包含 jdk.nashorn.api.scripting 与 jdk.nashorn.api.tree 包

  • jdk.scripting.nashorn.shell:包含 jjs 工具

但这一弃用将不会以任何方式影响 javax.script API。

Nashorn JavaScript 引擎发布时,其性能与之前的 Rhino 实现相比,提升达到 2 到 10 倍,这也是它能替代前者的原因之一,并且其采用也很广泛。但是在 2018 年 9 月发布的 JDK 11 中已经将其弃用(JEP 335),JEP 372 认为这么长的时间过去了,使用它的开发人员已经有足够的时间进行了迁移。

不过开发者对此有不同看法,有人认为 Java 一直以高度向后兼容闻名,不应该删除,有人吐槽公司还在使用 Rhino,也有人建议直接切换到 GraalVM,因为它是 JavaScript 与 Node 的更完整的实现,并且速度更快。

Java 8 Nashorn 引擎

Java 8 Nashorn 引擎

Java 8 Nashorn 脚本引擎

java8 终于来了.函数式接口,lambda表达式期待很久了.新的武器在手,应该可以玩出新花样.

前两天无意中发现java8 中还带了另外一个有意思的东西.

Nashorn 一个javascript引擎.

这等好玩的东西不把玩一下实在是浪费了.所以直接找到了oracle官方的介绍文档.说实话,文档真给力啊.

这篇文章是我一边看Oracle官方文档,一边敲代码试验,一边写的,不算是翻译的文档,算是中文版总结文档吧.呵呵.

#原文地址:Oracle Nashorn: A Next-Generation JavaScript Engine for the JVM

java7以前,JDK内置了一个基于Mozilla Rhino的javascript脚本引擎.在java8里面,基于JSR292和invokedynamic重新提供了一个新的javascript引擎-Oracle Nashorn.它更符合ECMA标准的javascript规范,而且基于invokedynamic调用拥有更好的性能.

文章使用的是最新的JDK8.所以想用要先装一下.

  • 第一个栗子

    第一个程序一定是HelloWorld.而且是命令行下面的实现.因此.打开一个命令行吧.

    如果你的命令行配好了,输入 jjs 回车

    就可以看到Nashrn的命令行了.

    print("hello halu");

    如果你人品没问题,你一定看到输出了...../抠鼻

  • 第二个栗子

    命令行下面可以用了,那么抓紧试试用js文件吧.

    把下面的代码保存在一个文件里面,我的文件名是halu.js

      function SayHi(){
          print("hello halu");
       }
       SayHi();
    

    然后打开命令行,cd到文件所在的目录.

windows下面cd有个技巧可以用.在文件夹空白的位置按住shift右击鼠标,菜单中会出现在此处打开命令窗口的选项,一般人我可不告诉他.

命令行下输入 jjs halu.js 就可以看到执行结果了.

  • 第三个栗子

    要知道,这可是java8 环境.看下面的例子吧.

      var data = [1,2,3,4,5,6,7,8,9,10];
      var filtered = data.filter(function(i){
           return i%2 == 0;
      },0);
      print(filtered);
      var sumOfFilterd = filtered.reduce(function (acc,next){
      return acc + next;
          },0);
      print(sumOfFilterd);
    

看一下执行结果吧.这个例子里面信息量可是巨大的.

Nashorn 只是使用遵从 ECMA 规范的javascript语言,在网页上常用的对象Nashorn里面并没有.比如说 console,window等对象.

  • 第四个栗子

命令行执行以下 jjs -help,在帮助中可以看到.

  • jjs可以运行javaFX程序脚本
  • 可以使用javascript严格模式.
  • 可以指定额外的classpath.
  • 一个有趣的脚本模式

脚本模式很有趣,你可以使用jjs运行使用javascript编写的系统脚本.类似python,ruby,bash脚本.脚本模式有两种扩展:heredocsshell invocations.

 var data = {
      foo:"bar",
      time: new Date()
 };
 print("< So...foo = ${data.foo} and the current time is ${data.time} EOF");

使用 jjs -scripting halu.js 执行该脚本.

heredocs 是一种简单的多行文本,使用类似bash的语法.使用 < 符号开始后面跟一个特殊标记.字符串中可以使用 ${} 表达式(类似EL表达式).需要注意的是,如果使用单引号引起来的字符串,内部的标示是不会被替换的.

  • 第五个栗子

Shell invocations 是允许调用命令行程序.

 var lines =\`ls`;
 print(lines);

这样就可以执行shell命令了.当然windows下面失败....

**注意符号是 ` [波浪线那个键],不是 '' [单引号] ** ,我找了好久才发现.

  • 第六个栗子

下面我们来写一个 java 程序

 import javax.script.ScriptEngine;
 import javax.script.ScriptEngineManager;
 public class halu{
     public static void main(String[] args) throws Throwable{
         ScriptEngineManager engineManager = new ScriptEngineManager();
         ScriptEngine engine = engineManager.getEngineByName("nashorn");
         engine.eval("function sum(a,b){return a+b;}");
         System.out.println(engine.eval("sum(1,2);"));
     }
 }

这段代码很简单,使用ScriptEngineManager 获得一个 ScriptEngine.然后通过eval函数执行字符串脚本.

 Invocable invocable = (Invocable) engine;
 System.out.println(invocable.invokeFunction("sum",1,3));

engine 也可以使用invocable接口调用脚本内的函数.

增加一个 Adder.java 的接口

 public interface Adder{
     int sum(int a, int b);
 }

halu类里面

 Adder adderaa = invocable.getInterface(Adder.class);
 System.out.println(""+ adderaa.sum(2,3));

这样可以将javascript的类映射到java的接口上.个人感觉这是个很强大的功能.

读取脚本文件执行.使用 java.io.FileReader;

 engine.eval(new FileReader("halu.js"));
  • 第七个栗子

我们来使用javascript调用java

  print(java.lang.System.currentTimeMillis());
  var file = new java.io.File("halu.js");
  print(file.getAbsolutePath());
  print(file.absolutePath);

使用 jjs 命令执行哦~

集合的使用

 var stack =
 new java.util.LinkedList();
 [1, 2, 3, 4].forEach(function(item) {
      stack.push(item);
 });
 print(stack);
 print(stack.getClass());
  • 第八个栗子

javascript实现java接口

 var iterator = new java.util.Iterator({
     i: 0,
     hasNext: function() {
         return this.i < 10;
     },
     next: function() {
         return this.i++;
     }
 });
 print(iterator instanceof Java.type("java.util.Iterator"));
 while (iterator.hasNext()) {
     print("-> " + iterator.next());
 }
  • 第九个栗子

javascript 实现多个接口

var ObjectType = Java.type("java.lang.Object");
var Comparable = Java.type("java.lang.Comparable");
var Serializable = Java.type("java.io.Serializable");
var MyExtender = Java.extend(
    ObjectType, Comparable, Serializable);
var instance = new MyExtender({
    someInt: 0,
    compareTo: function(other) {
        var value = other["someInt"];
        if (value === undefined) {
            return 1;
        }
        if (this.someInt < value) {
            return -1;
        } else if (this.someInt == value) {
            return 0;
        } else {
            return 1;
        }
    }
});
print(instance instanceof Comparable);
print(instance instanceof Serializable);
print(instance.compareTo({ someInt: 10 }));
print(instance.compareTo({ someInt: 0 }));
print(instance.compareTo({ someInt: -10 }));

终于完了....累死我了....

感受

Nashorn 真心好玩.javascript语言本身就有无限可能性,应该能做出来一些好玩的东西.下面就该考虑如何使用Nashorn做点东西了.

#PS: shell invocable 不支持 windows 真心觉得坑.....谁要是有办法请留言给我.

Java 8 新特性-菜鸟教程 (7) -Java 8 Nashorn JavaScript

Java 8 新特性-菜鸟教程 (7) -Java 8 Nashorn JavaScript

Java 8 Nashorn JavaScript

 

Nashorn 一个 javascript 引擎。

从JDK 1.8开始,Nashorn取代Rhino(JDK 1.6, JDK1.7)成为Java的嵌入式JavaScript引擎。Nashorn完全支持ECMAScript 5.1规范以及一些扩展。它使用基于JSR 292的新语言特性,其中包含在JDK 7中引入的 invokedynamic,将JavaScript编译成Java字节码。

与先前的Rhino实现相比,这带来了2到10倍的性能提升。


jjs

jjs是个基于Nashorn引擎的命令行工具。它接受一些JavaScript源代码为参数,并且执行这些源代码。

例如,我们创建一个具有如下内容的sample.js文件:

print(''Hello World!'');

打开控制台,输入以下命令:

$ jjs sample.js

以上程序输出结果为:

Hello World!

jjs 交互式编程

打开控制台,输入以下命令:

$ jjs
jjs> print("Hello, World!")
Hello, World!
jjs> quit()
>>

传递参数

打开控制台,输入以下命令:

$ jjs -- a b c
jjs> print(''字母: '' +arguments.join(", "))
字母: a, b, c
jjs>

Java 中调用 JavaScript

使用 ScriptEngineManager, JavaScript 代码可以在 Java 中执行,实例如下:

import javax.script.ScriptEngineManager;
import javax.script.ScriptEngine;
import javax.script.ScriptException;
 
public class Java8Tester {
   public static void main(String args[]){
   
      ScriptEngineManager scriptEngineManager = new ScriptEngineManager();
      ScriptEngine nashorn = scriptEngineManager.getEngineByName("nashorn");
        
      String name = "Runoob";
      Integer result = null;
      
      try {
         nashorn.eval("print(''" + name + "'')");
         result = (Integer) nashorn.eval("10 + 2");
         
      }catch(ScriptException e){
         System.out.println("执行脚本错误: "+ e.getMessage());
      }
      
      System.out.println(result.toString());
   }
}

 

执行以上脚本,输出结果为:

$ javac Java8Tester.java 
$ java Java8Tester
Runoob
12

JavaScript 中调用 Java

以下实例演示了如何在 JavaScript 中引用 Java 类:

var BigDecimal = Java.type(''java.math.BigDecimal'');

function calculate(amount, percentage) {

   var result = new BigDecimal(amount).multiply(
   new BigDecimal(percentage)).divide(new BigDecimal("100"), 2, BigDecimal.ROUND_HALF_EVEN);
   
   return result.toPlainString();
}

var result = calculate(568000000000000000023,13.9);
print(result);

我们使用 jjs 命令执行以上脚本,输出结果如下:

$ jjs sample.js
78952000000000002017.94

 

Java 8 新特性探究(十二)Nashorn :新犀牛

Java 8 新特性探究(十二)Nashorn :新犀牛

Nashorn是什么?如何用?性能怎样?有什么作用?本文将对这些问题进行解答。。

今天关于Java 7下的Nashornjava 7z的分享就到这里,希望大家有所收获,若想了解更多关于2020 年第一个候选 Java 增强提案,删除 Nashorn JavaScript 引擎、Java 8 Nashorn 引擎、Java 8 新特性-菜鸟教程 (7) -Java 8 Nashorn JavaScript、Java 8 新特性探究(十二)Nashorn :新犀牛等相关知识,可以在本站进行查询。

本文标签: