1

javax.script.*Java プログラムでのスクリプト作成に Rhino を使用しています。

スクリプトはインターフェイスをうまく実装できますが、同様の構文を使用して抽象クラスをインスタンス化しようとすると (実装されていないメソッドの定義を与える)、MyTestAbstractClass(インスタンス化しようとしているクラスが) インターフェイスまたは概要。私は何か非常に間違ったことをしていますか?

これは私が使用しているJavascriptコードです:

var testObject  = new foo.mytestpackage.TestAbstractClass() {
    printMessage: function() {
        print("foo");
    }
};

TestAbstractClass通常のコンストラクター (パラメーターなし) を持つクラスの場合、次のスタックトレースを取得します。

javax.script.ScriptException: sun.org.mozilla.javascript.internal.EvaluatorException: error instantiating (JavaAdapter: first arg should be interface Class (<Unknown source>#1)): class com.merkle.TestObject is interface or abstract (<Unknown source>#1) in <Unknown source> at line number 1
    at com.sun.script.javascript.RhinoScriptEngine.eval(Unknown Source)
    at com.sun.script.javascript.RhinoScriptEngine.eval(Unknown Source)
    at javax.script.AbstractScriptEngine.eval(Unknown Source)

私は Sun の (聞いたところ、少し簡略化された) Rhino 実装を使用していますが、公式の Rhino jar を使用するのはかなり大きいので避けたいと思っています。

4

1 に答える 1

2

Java 7 の JavaScript エンジンに関するOracle のリリース ノートでは、抽象型のインスタンス化がサポートされていないことが示唆されています。

RhinoJavaAdapterは上書きされました。JavaAdapterJavaクラスをJavaScriptで拡張し、JavaインターフェースをJavaScriptで実装できる機能です。Rhino のものJavaAdapterを独自の の実装に置き換えましJavaAdapterた。私たちの実装では、JavaScript オブジェクトによって実装できる Java インターフェイスは 1 つだけです。

これは、次のエラー メッセージによって裏付けられているようです。

JavaAdapter: first arg should be interface Class (<Unknown source>#1)

エンジンを切り替えたくない場合は、Java で型を実装し、その実装を使用する必要があります。

于 2013-05-16T13:36:36.903 に答える