Java Language
Nashorn JavaScriptエンジン
サーチ…
前書き
Nashornは、OracleによってJavaで開発されたJavaScriptエンジンであり、Java 8でリリースされています.Nashornは、JSR-223を介してJavaアプリケーションにJavascriptを組み込み、スタンドアロンのJavascriptアプリケーションを開発することを可能にし、 より優れた実行時パフォーマンスとECMA正規化されたJavascript仕様。
構文
- ScriptEngineManager // ScriptEngineクラスの検出とインストールのメカニズムを提供します。 SPI(Service Provider Interface)を使用して、
- ScriptEngineManager.ScriptEngineManager()//推奨コンストラクタ
- ScriptEngine //スクリプト言語へのインターフェイスを提供する
- ScriptEngine ScriptEngineManager.getEngineByName(String shortName)//指定された実装のファクトリメソッド
- Object ScriptEngine.eval(String script)//指定されたスクリプトを実行します。
- Object ScriptEngine.eval(Reader reader)//指定されたソースからスクリプトをロードして実行します。
- ScriptContext ScriptEngine.getContext()//デフォルトのバインディング、リーダ、ライターのプロバイダを返します。
- void ScriptContext.setWriter(Writer writer)//スクリプト出力を送信する宛先を設定します。
備考
NashornはJavaで書かれ、Java 8に含まれるJavaScriptエンジンです。必要なものはすべてjavax.script
パッケージにバンドルされています。
ScriptEngineManager
は汎用APIが用意されているため、さまざまなスクリプト言語(JavaScriptのみならずNashornだけでなく)のスクリプトエンジンを入手できます。
グローバル変数を設定する
// Obtain an instance of JavaScript engine
ScriptEngineManager manager = new ScriptEngineManager();
ScriptEngine engine = manager.getEngineByName("nashorn");
// Define a global variable
engine.put("textToPrint", "Data defined in Java.");
// Print the global variable
try {
engine.eval("print(textToPrint);");
} catch (ScriptException ex) {
ex.printStackTrace();
}
// Outcome:
// 'Data defined in Java.' printed on standard output
ハロー・ナショーン
// Obtain an instance of JavaScript engine
ScriptEngineManager manager = new ScriptEngineManager();
ScriptEngine engine = manager.getEngineByName("nashorn");
// Execute an hardcoded script
try {
engine.eval("print('Hello Nashorn!');");
} catch (ScriptException ex) {
// This is the generic Exception subclass for the Scripting API
ex.printStackTrace();
}
// Outcome:
// 'Hello Nashorn!' printed on standard output
JavaScriptファイルを実行する
// Required imports
import javax.script.ScriptEngineManager;
import javax.script.ScriptEngine;
import javax.script.ScriptException;
import java.io.FileReader;
import java.io.FileNotFoundException;
// Obtain an instance of the JavaScript engine
ScriptEngineManager manager = new ScriptEngineManager();
ScriptEngine engine = manager.getEngineByName("nashorn");
// Load and execute a script from the file 'demo.js'
try {
engine.eval(new FileReader("demo.js"));
} catch (FileNotFoundException ex) {
ex.printStackTrace();
} catch (ScriptException ex) {
// This is the generic Exception subclass for the Scripting API
ex.printStackTrace();
}
// Outcome:
// 'Script from file!' printed on standard output
demo.js :
print('Script from file!');
スクリプト出力を傍受する
// Obtain an instance of JavaScript engine
ScriptEngineManager manager = new ScriptEngineManager();
ScriptEngine engine = manager.getEngineByName("nashorn");
// Setup a custom writer
StringWriter stringWriter = new StringWriter();
// Modify the engine context so that the custom writer is now the default
// output writer of the engine
engine.getContext().setWriter(stringWriter);
// Execute some script
try {
engine.eval("print('Redirected text!');");
} catch (ScriptException ex) {
ex.printStackTrace();
}
// Outcome:
// Nothing printed on standard output, but
// stringWriter.toString() contains 'Redirected text!'
算術文字列を評価する
// Obtain an instance of JavaScript engine
ScriptEngineManager manager = new ScriptEngineManager();
ScriptEngine engine = manager.getEngineByName("JavaScript");
//String to be evaluated
String str = "3+2*4+5";
//Value after doing Arithmetic operation with operator precedence will be 16
//Printing the value
try {
System.out.println(engine.eval(str));
} catch (ScriptException ex) {
ex.printStackTrace();
}
//Outcome:
//Value of the string after arithmetic evaluation is printed on standard output.
//In this case '16.0' will be printed on standard output.
NashornのJavaScriptでのJavaオブジェクトの使用
NashornエンジンにJavaオブジェクトを渡して、Javaコードで処理することは可能です。同時に、いくつかのJavaScript(およびNashorn)固有の構造があり、Javaオブジェクトでどのように動作するかは必ずしも明確ではありません。
下に、JavaScript構造内のネイティブJavaオブジェクトの動作を説明する表があります。
テスト済みの構成:
- if節の式。 if節のJS式では、Javaと違ってブール値である必要はありません。これは、偽の値(null、undefined、0、空文字列など)に対してfalseと評価されます。
- ステートメントごとにNashornには、それぞれ異なるJSおよびJavaオブジェクトに対して繰り返すことができる特別な種類のループがあります。
- オブジェクトのサイズを取得します。 JSオブジェクトでは、配列または文字列のサイズを返すプロパティの長さがあります。
結果:
タイプ | もし | それぞれ | .length |
---|---|---|---|
Java null | 偽 | 反復なし | 例外 |
Javaの空の文字列 | 偽 | 反復なし | 0 |
Java文字列 | 真実 | 文字列を繰り返し処理する | 文字列の長さ |
Java整数/ロング | 値!= 0 | 反復なし | 未定義 |
Java ArrayList | 真実 | 要素を反復する | リストの長さ |
Javaハッシュマップ | 真実 | 値を反復する | ヌル |
Java HashSet | 真実 | アイテムを反復する | 未定義 |
推奨事項:
- 文字列がnullでなく、空でないかどうかを確認するには、
if (some_string)
を使用することをお勧めします -
for each
がすべてのコレクションを繰り返し処理するために安全に使用でき、コレクションがiterable、nullまたはundefinedでない場合は例外を発生しません - オブジェクトの長さを取得する前に、nullまたは未定義がチェックされていなければなりません(メソッドの呼び出しやJavaオブジェクトのプロパティの取得の場合は同じです)
スクリプトからのインターフェースの実装
import java.io.FileReader;
import java.io.IOException;
import javax.script.ScriptEngine;
import javax.script.ScriptEngineManager;
import javax.script.ScriptException;
public class InterfaceImplementationExample {
public static interface Pet {
public void eat();
}
public static void main(String[] args) throws IOException {
// Obtain an instance of JavaScript engine
ScriptEngineManager manager = new ScriptEngineManager();
ScriptEngine engine = manager.getEngineByName("nashorn");
try {
//evaluate a script
/* pet.js */
/*
var Pet = Java.type("InterfaceImplementationExample.Pet");
new Pet() {
eat: function() { print("eat"); }
}
*/
Pet pet = (Pet) engine.eval(new FileReader("pet.js"));
pet.eat();
} catch (ScriptException ex) {
ex.printStackTrace();
}
// Outcome:
// 'eat' printed on standard output
}
}
グローバル変数の設定と取得
// Obtain an instance of JavaScript engine
ScriptEngineManager manager = new ScriptEngineManager();
ScriptEngine engine = manager.getEngineByName("nashorn");
try {
// Set value in the global name space of the engine
engine.put("name","Nashorn");
// Execute an hardcoded script
engine.eval("var value='Hello '+name+'!';");
// Get value
String value=(String)engine.get("value");
System.out.println(value);
} catch (ScriptException ex) {
// This is the generic Exception subclass for the Scripting API
ex.printStackTrace();
}
// Outcome:
// 'Hello Nashorn!' printed on standard output
Modified text is an extract of the original Stack Overflow Documentation
ライセンスを受けた CC BY-SA 3.0
所属していない Stack Overflow