掃二維碼與項(xiàng)目經(jīng)理溝通
我們?cè)谖⑿派?4小時(shí)期待你的聲音
解答本文疑問(wèn)/技術(shù)咨詢(xún)/運(yùn)營(yíng)咨詢(xún)/技術(shù)建議/互聯(lián)網(wǎng)交流
java8 終于來(lái)了.函數(shù)式接口,lambda表達(dá)式期待很久了.新的武器在手,應(yīng)該可以玩出新花樣.
創(chuàng)新互聯(lián)是一家專(zhuān)業(yè)提供富裕企業(yè)網(wǎng)站建設(shè),專(zhuān)注與網(wǎng)站制作、成都網(wǎng)站建設(shè)、H5場(chǎng)景定制、小程序制作等業(yè)務(wù)。10年已為富裕眾多企業(yè)、政府機(jī)構(gòu)等服務(wù)。創(chuàng)新互聯(lián)專(zhuān)業(yè)網(wǎng)站制作公司優(yōu)惠進(jìn)行中。
前兩天無(wú)意中發(fā)現(xiàn)java8 中還帶了另外一個(gè)有意思的東西.
Nashorn 一個(gè)javascript引擎.
這等好玩的東西不把玩一下實(shí)在是浪費(fèi)了.所以直接找到了oracle官方的介紹文檔.說(shuō)實(shí)話,文檔真給力啊.
這篇文章是我一邊看Oracle官方文檔,一邊敲代碼試驗(yàn),一邊寫(xiě)的,不算是翻譯的文檔,算是中文版總結(jié)文檔吧。呵呵。
原文地址:Oracle Nashorn: A Next-Generation JavaScript Engine for the JVM
java7以前,JDK內(nèi)置了一個(gè)基于Mozilla Rhino的javascript腳本引擎。在java8里面,基于JSR292和invokedynamic重新提供了一個(gè)新的javascript引擎-Oracle Nashorn。它更符合ECMA標(biāo)準(zhǔn)的javascript規(guī)范,而且基于invokedynamic調(diào)用擁有更好的性能。
文章使用的是***的JDK8.所以想用要先裝一下。
***個(gè)栗子
***個(gè)程序一定是HelloWorld.而且是命令行下面的實(shí)現(xiàn).因此.打開(kāi)一個(gè)命令行吧.
如果你的命令行配好了,輸入 jjs 回車(chē)
就可以看到Nashrn的命令行了.
print("hello halu");
如果你人品沒(méi)問(wèn)題,你一定看到輸出了…../摳鼻
第二個(gè)栗子
命令行下面可以用了,那么抓緊試試用js文件吧.
把下面的代碼保存在一個(gè)文件里面,我的文件名是halu.js
function SayHi(){
print(“hello halu”);
}
SayHi();
然后打開(kāi)命令行,cd到文件所在的目錄.
windows下面cd有個(gè)技巧可以用.在文件夾空白的位置按住shift右擊鼠標(biāo),菜單中會(huì)出現(xiàn)在此處打開(kāi)命令窗口的選項(xiàng),一般人我可不告訴他.
命令行下輸入 jjs halu.js 就可以看到執(zhí)行結(jié)果了.
第三個(gè)栗子
要知道,這可是java8 環(huán)境.看下面的例子吧.
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);
看一下執(zhí)行結(jié)果吧.這個(gè)例子里面信息量可是巨大的.
Nashorn 只是使用遵從 ECMA 規(guī)范的javascript語(yǔ)言,在網(wǎng)頁(yè)上常用的對(duì)象Nashorn里面并沒(méi)有.比如說(shuō)console,window等對(duì)象.
第四個(gè)栗子
命令行執(zhí)行以下 jjs -help,在幫助中可以看到.
jjs可以運(yùn)行javaFX程序腳本
可以使用javascript嚴(yán)格模式.
可以指定額外的classpath.
一個(gè)有趣的腳本模式
腳本模式很有趣,你可以使用jjs運(yùn)行使用javascript編寫(xiě)的系統(tǒng)腳本.類(lèi)似python,ruby,bash腳本.腳本模式有兩種擴(kuò)展:heredocs和shell 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 執(zhí)行該腳本.
heredocs 是一種簡(jiǎn)單的多行文本,使用類(lèi)似bash的語(yǔ)法.使用 < 符號(hào)開(kāi)始后面跟一個(gè)特殊標(biāo)記.字符串中可以使用 ${} 表達(dá)式(類(lèi)似EL表達(dá)式).需要注意的是,如果使用單引號(hào)引起來(lái)的字符串,內(nèi)部的標(biāo)示是不會(huì)被替換的.
第五個(gè)栗子
Shell invocations 是允許調(diào)用命令行程序.
var lines =`ls`;
print(lines);
這樣就可以執(zhí)行shell命令了.當(dāng)然windows下面失敗….
*注意符號(hào)是 ` [波浪線那個(gè)鍵],不是 ' [單引號(hào)] * ,我找了好久才發(fā)現(xiàn).
第六個(gè)栗子
下面我們來(lái)寫(xiě)一個(gè) 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);“));
}
}
這段代碼很簡(jiǎn)單,使用ScriptEngineManager 獲得一個(gè) ScriptEngine.然后通過(guò)eval函數(shù)執(zhí)行字符串腳本.
Invocable invocable = (Invocable) engine;
System.out.println(invocable.invokeFunction(“sum”,1,3));
engine 也可以使用invocable接口調(diào)用腳本內(nèi)的函數(shù).
增加一個(gè) Adder.java 的接口
public interface Adder{
int sum(int a, int b);
}
halu類(lèi)里面
Adder adderaa = invocable.getInterface(Adder.class);
System.out.println(““+ adderaa.sum(2,3));
這樣可以將javascript的類(lèi)映射到j(luò)ava的接口上.個(gè)人感覺(jué)這是個(gè)很強(qiáng)大的功能.
讀取腳本文件執(zhí)行.使用 java.io.FileReader;
engine.eval(new FileReader(“halu.js”));
第七個(gè)例子
我們來(lái)使用javascript調(diào)用java
print(java.lang.System.currentTimeMillis());
var file = new java.io.File(“halu.js”);
print(file.getAbsolutePath());
print(file.absolutePath);
使用 jjs 命令執(zhí)行哦~
集合的使用
var stack =
new java.util.LinkedList();
[1, 2, 3, 4].forEach(function(item) {
stack.push(item);
});
print(stack);
print(stack.getClass());
第八個(gè)例子
javascript實(shí)現(xiàn)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());
}
第九個(gè)例子
javascript 實(shí)現(xiàn)多個(gè)接口
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語(yǔ)言本身就有無(wú)限可能性,應(yīng)該能做出來(lái)一些好玩的東西.下面就該考慮如何使用Nashorn做點(diǎn)東西了。

我們?cè)谖⑿派?4小時(shí)期待你的聲音
解答本文疑問(wèn)/技術(shù)咨詢(xún)/運(yùn)營(yíng)咨詢(xún)/技術(shù)建議/互聯(lián)網(wǎng)交流