サーチ…


前書き

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オブジェクトの動作を説明する表があります。

テスト済みの構成:

  1. if節の式。 if節のJS式では、Javaと違ってブール値である必要はありません。これは、偽の値(null、undefined、0、空文字列など)に対してfalseと評価されます。
  2. ステートメントごとにNashornには、それぞれ異なるJSおよびJavaオブジェクトに対して繰り返すことができる特別な種類のループがあります。
  3. オブジェクトのサイズを取得します。 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