Nashorn - JS引擎

Nashorn是在java中高效动态执行JS代码的运行环境。

ScriptEngine engine = new ScriptEngineManager().getEngineByName("nashorn");
        engine.eval("print(‘hello‘);"); // execute js from source
        File f = new File("resources/scripts.js");
        engine.eval(new FileReader(f)); // execute js from file

调用JS

  首先把需要调用的js代码保存为scripts.js:

function add(a, b) {
    return a + b;
}

var f1 = function(name) {
    print("JS: " + name);
    return "Greeting from JS";
}
var f2 = function(obj) {
    print("JS Class: " + Object.prototype.toString.call(obj));
}

Java中调用:

        ScriptEngine engine = new ScriptEngineManager()
                .getEngineByName("nashorn");
        engine.eval("print(‘hello‘);"); // execute js from source
        File f = new File("resources/scripts.js");
        engine.eval(new FileReader(f)); // execute js from file
        Invocable invocable = (Invocable) engine;
        Object sum = invocable.invokeFunction("add", 1, 2);
        System.out.println(sum);
        invocable.invokeFunction("f2", new Date());
        invocable.invokeFunction("f2", LocalDateTime.now());            

由于js中的代码在jvm中是原生态调用,类型不会丢失。

调用Java

  Java方法必须是public。否则调用的时候找不到

    public static String greeting(String name) {
        System.out.println("From Java " + name);
        return "From Java";
    }

    public static void getCls(Object obj) {
        System.out.println(obj.getClass());
    }

ScriptEngine engine = new ScriptEngineManager().getEngineByName("nashorn");
     File f = new File("resources/scripts.js");
     engine.eval(new FileReader(f)); // execute js from file

 

  JS代码:

var cls = Java.type("nashorn.NashornTest");
print(cls.greeting(‘Zhijie‘));

原始JS类型可以转换成适当的Java包装类。原生JS对象表示成内部适配类。

  

cls.getCls(123);
//class java.lang.Integer

cls.getCls(49.99);
//class java.lang.Double

cls.getCls(true);
//class java.lang.Boolean

cls.getCls("hi there")
//class java.lang.String

cls.getCls(new Number(23));
//class jdk.nashorn.internal.objects.NativeNumber

cls.getCls(new Date());
//class jdk.nashorn.internal.objects.NativeDate

cls.getCls(new RegExp());
//class jdk.nashorn.internal.objects.NativeRegExp

cls.getCls({foo: ‘bar‘});
//class jdk.nashorn.internal.scripts.JO4

ScriptObjectMirror

jdk.nashorn.api.scripting.ScriptObjectMirror是JS对象在Java中的映射。这个类实现了Map接口。

    public static void f(ScriptObjectMirror mirror) {
        System.out.println(mirror.getClassName() + ": " +
            Arrays.toString(mirror.getOwnKeys(true)));
    }

    public static void callMethodOfJSObject(ScriptObjectMirror person) {
        System.out.println("Full Name is: " + person.callMember("getFullName"));
    }
cls.f({a:‘a‘,b:‘b‘});

function Person(firstName, lastName) {
    this.firstName = firstName;
    this.lastName = lastName;
    this.getFullName = function() {
        return this.firstName + " " + this.lastName;
    }
}

var person1 = new Person("Zhijie", "Liu");
cls.callMethodOfJSObject(person1);

Nashorn扩展了ECMAScript 5:

  • Typed Arrays
  • Collections and For Each
  • Lambda expressions and Streams
  • Extending classes
  • Parameter overloading
  • Java Beans
  • Function Literals
  • Binding properties
  • Trimming strings
  • Whereis
  • Import Scopes
  • Convert arrays
  • Calling Super
  • Loading scripts

可以进一步阅读http://winterbe.com/posts/2014/04/05/java8-nashorn-tutorial/

时间: 2024-08-08 00:00:30

Nashorn - JS引擎的相关文章

Java 8 的 Nashorn 脚本引擎教程

本文为了解所有关于 Nashorn JavaScript 引擎易于理解的代码例子. Nashorn JavaScript 引擎是Java SE 8的一部分,它与其它像Google V8 (它是Google Chrome 和Node.js的引擎)的独立引擎相互竞争. Nashorn 扩展了Java在JVM上运行动态JavaScript脚本的能力. 在接下来的大约15分钟里,您将学习如何在 JVM 上动态运行 JavaScript. 通过一些简短的代码示例演示最近 Nashorn 的语言特性. 学习

浏览器内核、渲染引擎、js引擎

[1]定义 浏览器内核分成两部分渲染引擎和js引擎,由于js引擎越来越独立,内核就倾向于只指渲染引擎 渲染引擎是一种对HTML文档进行解析并将其显示在页面上的工具 [2]常见引擎 渲染引擎: firefox使用gecko引擎 IE使用Trident引擎 2015年微软推出自己新的浏览器,原名叫斯巴达,后改名edge,使用edge引擎 opera最早使用Presto引擎,后来弃用 chrome\safari\opera使用webkit引擎 13年chrome和opera开始使用Blink引擎 js

单线程的JS引擎

先来思考一个问题,JS 是单线程的么?为什么单线程的JavaScript却能让AJAX异步发送和回调请求,还有setTimeout也看起来像是多线程的?还有non-blocking IO, event loop等概念. 目录: JS单线程 浏览器多线程 setTimeout(func, 0) 的应用场景 setTimeout与setInterval 参考资料 TODO: 接下来,梳理JS的并发模型与 Event Loop https://developer.mozilla.org/zh-CN/d

【转】浏览器内核、渲染引擎、js引擎

[1]定义 浏览器内核分成两部分渲染引擎和js引擎,由于js引擎越来越独立,内核就倾向于只指渲染引擎 渲染引擎是一种对HTML文档进行解析并将其显示在页面上的工具 [2]常见引擎 渲染引擎(内核): firefox使用gecko引擎 IE使用Trident引擎 2015年微软推出自己新的浏览器,原名叫斯巴达,后改名edge,使用edge引擎 opera最早使用Presto引擎,后来弃用 chrome\safari\opera使用webkit引擎 13年chrome和opera开始使用Blink引

【repost】浏览器内核、渲染引擎、js引擎

[1]定义 浏览器内核分成两部分渲染引擎和js引擎,由于js引擎越来越独立,内核就倾向于只指渲染引擎 渲染引擎是一种对HTML文档进行解析并将其显示在页面上的工具 [2]常见引擎 渲染引擎: firefox使用gecko引擎 IE使用Trident引擎 2015年微软推出自己新的浏览器,原名叫斯巴达,后改名edge,使用edge引擎 opera最早使用Presto引擎,后来弃用 chrome\safari\opera使用webkit引擎 13年chrome和opera开始使用Blink引擎 js

java调用javascript :js引擎rhino

java调用javascript :js引擎rhino JavaJavaScriptEclipse脚本SQL 前段时间,在浏览javaeye论坛,看见有人征集如何在java中运行数学表达式.结果方案五花八门:1.jakarta commons JEXL. 2.Beanshell3.Java Math Expression Parser jep 4.parse combinator jparsec 5.jdk 6.0的 script6.利用SQL 7.自己写语法分析如果自己写语法分析,没有个200

JS引擎

在javax.script包下提供有关脚本引擎的类和接口,为我们定义了一系列的规范,达到可以在java应用程序中执行脚本语言编写的程序. javax.script包的主要功能有: 1.脚本执行:执行脚本文件中的程序,使用ScriptEngine的eval方法和Invocable接口的方法. 2.绑定:将java对象作为指定变量公开给脚本程序.相当于为脚本设置全局变量之类的.Bingdings和ScriptContext类用于此目的. 3.编译:将脚本执行一次,生成中间代码,往后只需调用即可,实现

javascript从定义到执行 js引擎 闭包

javascript从定义到执行,JS引擎在实现层做了很多初始化工作,因此在学习JS引擎工作机制之前,我们需要引入几个相关的概念:执行环境 栈.全局对象.执行环境.变量对象.活动对象.作用域和作用域链等,这些概念正是JS引擎工作的核心组件.这篇文章的目的是孤立的为你讲解每一个概念,而 是通过一个简单的demo来展开分析,全局讲解JS引擎从定义到执行的每一个细节,以及这些概念在其中所扮演的角色. var x = 1;  //定义一个全局变量 x function A(y){ var x = 2; 

在Android上使用Google V8 JS 引擎

在cantk-runtime中直接使用的webview,通过JAVA扩展接口把Canvas的2d Context的API定向到JNI,通过OpenGL来图形加速,渲染速度大大提高.后来测试发现在大部分手机上都很正常,但是在有的老手机上速度不稳定,出现突然卡顿的情况.经过研究发现原因是老版本的webkit里没有requestAnimationFrame这个接口(或类似接口),用setTimeout来模拟的requestAnimationFrame非常不稳定. 为了解决这个问题,我们决定像其它Run