3

インターフェイスがあり、 http://docs.oracle.com/javase/6/docs/technotes/guides/scripting/programmer_guide/index.htmlru.focusmedia.odp.server.scripts.api.Scriptの例に従って実装しようとしました:

new Packages.ru.focusmedia.odp.server.scripts.api.Script() {
    ...
};

ただし、これにより次の例外が発生します。

javax.script.ScriptException: sun.org.mozilla.javascript.internal.EcmaError: TypeError: [JavaPackage ru.focusmedia.odp.server.scripts.api.Script] は関数ではなく、sun.org.mozilla.javascript です.internal.NativeJavaPackage. (#1) in at 行番号 1

new Packages.java.lang.Runnable()動作します。何が問題ですか?

更新: 最初は、スレッド コンテキスト クラス ローダーを設定することでこの問題が解決したと思っていましたが、スクリプトを少し変更した後に再発しました。

4

1 に答える 1

2

これは無効な JavaScript です:

new Object() {};

「new」を使用して関数を呼び出していますが、ステートメントを終了できません。開き中括弧は、オブジェクト リテラルの開始を示します (これは Java では有効な構文であり、無名サブクラスを作成します)。奇妙なことに、Rhino インタープリターは文句を言いませんが、ブラウザーのエンジンで正しくエラーをスローします。"SyntaxError: missing ; before statement"

オブジェクト リテラル表記を使用して実装を記述してみてください。

var impl = {
    run: function() {
        println('Hello, World!');
    }
};

これが実際の例です:

import javax.script.Invocable;
import javax.script.ScriptEngine;
import javax.script.ScriptEngineManager;

public class RhinoTest {
    private static final String JAVASCRIPT_SRC = 
            " var impl = { " +
            "     run: function() { " +
            "         println('Hello, World!'); " +
            "     } " +
            " }; ";

    public static void main(String[] args) throws Exception {
        ScriptEngineManager factory = new ScriptEngineManager();
        ScriptEngine engine = factory.getEngineByName("JavaScript");
        engine.eval(JAVASCRIPT_SRC);

        Object impl = engine.get("impl");
        Runnable r = ((Invocable) engine).getInterface(impl, Runnable.class);
        r.run();
    }
}
于 2012-08-02T00:37:24.353 に答える