在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本なんでしょうね
广告
将在 10 秒后关闭
bannerAds