在Java8上运行JavaScript
目标
- 【追記】Java 8 で追加された以下の機能ですが、Java 11 で廃止されました。
-
- Java6 あたりから、Java内にJavaScriptエンジン(Rhino)が追加されています。
-
- Java8 ではJavaScriptエンジン(Nashorn)の性能が向上したという話なので、いまさらながら少し動かしてみました
-
- でも性能測定とかはしません
- メソッドの詳細な説明もしないです
简要介绍
在Java中支持JavaScript有两种方式:一种是通过javax.script包来处理的库,另一种是命令行版本。
目前看来,虽然似乎有计划支持除了 JavaScript 之外的脚本语言,但实际上目前只支持 JavaScript。
命令行版本
命令行版本在Java6和Java7中,JDK的bin目录下有一个名为jrunscript的命令。看起来在Java8中这个命令仍然存在。
从Java8开始,JRE的bin目录中添加了一个名为jjs的命令。
它是否可以在使用环境(JRE)而不是开发环境(JDK)中使用呢?
我这次没有触碰过。
请将以下内容用中文进行释义:
javax.script 包
可以从 JavaScript 源代码的字符串中执行(也可以从文件中读取并执行)。
另外,您还可以使用Java和JavaScript进行数据交换和方法调用等操作。
示例源代码
暫時先試著運行了一下,例外處理被忽略了。
package test.javascript;
import java.util.Date;
import java.util.List;
import javax.script.Invocable;
import javax.script.ScriptEngine;
import javax.script.ScriptEngineFactory;
import javax.script.ScriptEngineManager;
/** Java と JavaScript の連携 */
public class JavaScriptTest {
public static void main(String[] args) throws Exception {
System.out.println("java.version: " + System.getProperty("java.version"));
// 対応している ScriptEngine の情報を出力
ScriptEngineManager manager = new ScriptEngineManager();
List<ScriptEngineFactory> engineFactories = manager.getEngineFactories();
for (ScriptEngineFactory factory : engineFactories) {
System.out.println("Engine: " + factory.getEngineName()
+ ", Version: " + factory.getEngineVersion());
System.out.println("Language: " + factory.getLanguageName()
+ ", Version: " + factory.getLanguageVersion());
System.out.println("Extensions: " + factory.getExtensions());
System.out.println("MimeTypes: " + factory.getMimeTypes());
System.out.println("Names: " + factory.getNames());
System.out.println();
}
ScriptEngine engine = manager.getEngineByName("JavaScript");
// JavaScript の実行
engine.eval("var message = 'Hello, I am JavaScript.'");
engine.eval("print('#1: ' + message)");
// Java のオブジェクトを JavaScript に渡してみる
engine.put("message2", "Hello, I am Java8.");
engine.put("today", new Date());
engine.eval("print('#2: ' + message2 + ' now : ' + today.toString())");
// JavaScript から Java のメソッドを使用
engine.eval("var obj = Java.type('test.javascript.JavaScriptTest');"
+ "print('#3: ' + obj.getMessage());");
engine.eval("obj.printMessage('Good afternoon.');");
// Java から JavaScript の値を取得
engine.eval("var message3 = 'Good evening.';");
Object message3 = engine.get("message3");
System.out.println("#5: " + message3);
// Java から JavaScript の関数を呼び出し
if (engine instanceof Invocable) {
Invocable invocable = (Invocable) engine;
engine.eval("var func = function(arg) { print('#6: ' + arg);}");
invocable.invokeFunction("func", "Good night.");
}
}
/** メッセージを返す */
public static String getMessage() {
return "Good morning.";
}
/** メッセージを出力 */
public static void printMessage(String message) {
System.out.println("#4: " + message);
}
}
动作的结果就是这样的感觉。
java.version: 1.8.0_65
Engine: Oracle Nashorn, Version: 1.8.0_65
Language: ECMAScript, Version: ECMA - 262 Edition 5.1
Extensions: [js]
MimeTypes: [application/javascript, application/ecmascript, text/javascript, text/ecmascript]
Names: [nashorn, Nashorn, js, JS, JavaScript, javascript, ECMAScript, ecmascript]
#1: Hello, I am JavaScript.
#2: Hello, I am Java8. now : Thu Nov 05 22:51:09 JST 2015
#3: Good morning.
#4: Good afternoon.
#5: Good evening.
#6: Good night.
涂鸦 (Tu2 ya1)
-
- Rhino の読みは「ライノー」で、英語で犀のこと
-
- Nashorn のよみは「ナースホルン」でドイツ語で犀のこと
- ネタ元はオライリーのJavaScript本なんでしょうね