成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

Java 8 Nashorn 腳本引擎

開發 后端
java8 終于來了.函數式接口,lambda表達式期待很久了.新的武器在手,應該可以玩出新花樣. 前兩天無意中發現java8 中還帶了另外一個有意思的東西. Nashorn 一個javascript引擎. 這等好玩的東西不把玩一下實在是浪費了.所以直接找到了oracle官方的介紹文檔.說實話,文檔真給力啊.

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腳本.腳本模式有兩種擴展: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 執行該腳本.

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做點東西了。

原文鏈接:http://my.oschina.net/jsmagic/blog/212455

 

責任編輯:林師授 來源: oschina
相關推薦

2016-12-15 14:13:16

Java 8Nashorn腳本

2014-07-14 11:34:53

Java 8Nashorn

2009-04-04 09:42:53

IE8JScript瀏覽器

2014-07-15 14:48:26

Java8

2014-03-19 11:04:14

Java 8Java8特性

2010-09-30 11:16:53

J2ME Snake腳

2009-12-28 10:16:48

Groovy 1.7

2011-08-29 15:10:19

JAVALua 腳本

2019-10-09 16:08:21

PythonPython教程Python 開發

2018-08-28 16:02:59

LinuxShellBash

2010-10-09 15:00:22

SnakeJ2ME

2025-04-17 02:00:00

2025-02-04 11:30:10

2016-09-26 14:16:18

shell腳本bash

2018-06-06 09:32:39

編程語言Python搜索引擎

2013-12-06 10:12:49

Android游戲引擎libgdx教程

2022-10-24 09:11:05

TypeScriptV8

2009-07-07 09:24:24

2012-12-24 08:51:23

iOSUnity3D

2024-12-26 00:14:45

C#腳本開源
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 久久人体视频 | 国产一区二区免费电影 | 天天碰日日操 | 中文av在线播放 | 国产精品美女久久久久久久久久久 | 在线免费观看成年人视频 | 亚洲性人人天天夜夜摸 | 91精品国产91久久久久久最新 | 国产98色在线 | 日韩 | 欧产日产国产精品国产 | 日日操夜夜操天天操 | 精品日韩欧美一区二区 | 99久久夜色精品国产亚洲96 | 美国十次成人欧美色导视频 | 精品婷婷| 国产98色在线 | 日韩 | 精品日韩一区二区 | av一区二区三区 | 精品久久久久久久人人人人传媒 | 激情婷婷 | 国产成人短视频在线观看 | 欧美精品一区三区 | 中文字幕在线观看国产 | av在线免费观看网址 | 色婷婷亚洲一区二区三区 | 日p视频免费看 | 伊人网在线播放 | 国产成人精品高清久久 | 精品欧美激情精品一区 | 欧美一区二区三区日韩 | 91在线第一页 | 国产精品久久久久久久岛一牛影视 | 欧美一级欧美一级在线播放 | 色爽女 | 亚洲一区二区三区 | 成人国产精品色哟哟 | www.国产91| 久久久久久免费观看 | 亚洲美女视频 | 一级黄在线观看 | 99在线免费观看视频 |