全国统一热线:

400-123-4567

澳门百老汇

news

百老汇平台

人才招聘

   人才管理 人才管理从战略和组织发展需求出发,围绕人才队伍建设,针对不同人才群体形成差异化的管理系统,构成人才标准、规划、选拔、培养、使用和保留的管理闭环。 推动关键岗位员工进行多岗位、跨职能、跨行业历练,...
点击查看更多

Java 8的Nashorn脚本引擎教程

2019-06-15 01:46

Java调用Javascript 函数

在 JavaScript 中调用 Java 方法很简单。首先我们定义一个静态的 Java 方法:

Nashorn javascript 引擎要么在java程序中以编程的方式使用要么在命令行工具jjs使用,jjs在目录$JAVA_HOME/bin中。如果你准备建立一个jjs的符号链接,如下:

Nashorn javascript是基于 ECMAScript 5.1 ,但nashorn后续版本将支持 ECMAScript 6:

ScriptEngine engine = new ScriptEngineManager().getEngineByName("nashorn"); engine.eval(new FileReader("script.js"));

Java Beans

下一个示例更改参数类型Object为ScriptObjectMirror,因此我们能获取到传入JavaScript中对象的一些信息:

static void fun4(ScriptObjectMirror person) {     System.out.println("Full Name is: " + person.callMember("getFullName")); } 

当我们传入一个新的person给java 方法时,我们能在控制台看到预期结果:

这里是一个对集合元素进行遍历的例子,使用的是 :

var MyJavaClass = Java.type('my.package.MyJavaClass'); var result = MyJavaClass.fun1('John Doe'); print(result); // Hi there from Java, John Doe // greetings from java 

当调用java 方法时,Nashorn怎样处理原生JavaScript类型与java类型转换?让我们用一个简单的例子来发现。

invocable.invokeFunction("fun2", new Date()); // [object java.util.Date]  invocable.invokeFunction("fun2", LocalDateTime.now()); // [object java.time.LocalDateTime]  invocable.invokeFunction("fun2", new Person()); // [object com.winterbe.java8.Person] 

你可以传递任意 Java 对象而不会在 JavaScript 这边丢失类型信息。因为脚本本身是在 JVM 虚拟机中执行的,我们可以完全利用 nashorn 引擎的 Java API 和外部库的强大功能。

过去我也发表了一些 文章 是关于如何在 Nashron 引擎中使用 Backbone.js 模型数据的。如果你想要了解更多 Java 8 的话可以去看看我的文章 Java 8 Tutorial 和 Java 8 Stream Tutorial.

var fun1 = function(name) {     print('Hi there from Javascript, ' + name);     return "greetings from javascript"; }; var fun2 = function (object) { print("JS Class Definition: " + Object.prototype.toString.call(object)); }; 

为了调用函数,你首先得把脚本引擎转换为 Invocable。NashornScriptEngine 实现了 Invocable 接口且定义一个调用JavaScript函数的方法 invokeFunction ,传入函数名即可。

$ cd /usr/bin $ ln -s $JAVA_HOME/bin/jjs jjs $ jjs jjs> print('Hello World'); 

教程关注的是在java代码中使用 nashorn ,所以我们现在跳过jjs。用java代码来一个简单的  HelloWorld示例,如下:

类型数组

print(" hehe".trimLeft()); // hehe print("hehe ".trimRight() + "he"); // hehehe 

在哪里

function sqr(x) x * x; print(sqr(3));    // 9 

属性绑定

Nashorn 支持java代码直接调用定义在脚本文件中JavaScript函数。你可以把java对象作为函数的参数且在调用函数的java方法中接收返回的数据。

function sqr(x) x * x; print(sqr(3));    // 9 

字符串处理

var Date = Java.type('java.util.Date'); var date = new Date(); date.year += 1900; print(date.year);  // 2014 

函数语法

var Runnable = Java.type('java.lang.Runnable'); var Printer = Java.extend(Runnable, {     run: function() {         print('printed from a separate thread');     } });  var Thread = Java.type('java.lang.Thread'); new Thread(new Printer()).start();  new Thread(function() {     print('printed from another thread'); }).start();  // printed from a separate thread // printed from another thread 

参数重载

var javaArray = Java.to([3, 5, 7, 11], "int[]"); 

调用父类函数

static String fun1(String name) {     System.out.format("Hi there from Java, %s", name);     return "greetings from java"; } 

全国统一热线

400-123-4567
+地址:广东省广州市天河区88号
+传真:+86-123-4567
+邮箱:admin@baidu.com

友情链接

微信平台

微信平台

手机官网

手机官网