0

Java 6 javax.script 機能を使用していますが、問題があります:

ScriptEngine.eval() メソッドを呼び出す前に、いくつかの属性を ScriptContext に設定します。

scriptContext.setAttribute("Utils", utils, ScriptContext.ENGINE_SCOPE);

私が呼び出すスクリプトで:

var s = utils.getMyString()

Java getMyString() メソッドは文字列 (java.lang.String) を返します。

scriptContext の「s」の型は、Java String インスタンスをラップする sun.org.mozilla.javascript.internal.NativeJavaObject です。

Java でコンテキストから属性を取得しようとすると、次のようになります。

(String) scriptContext.getAttribute("s");

私は得た

    java.lang.ClassCastException:
 sun.org.mozilla.javascript.internal.NativeJavaObject cannot be cast to java.lang.String

スクリプトに書くと:

var s = "hello world"

また

var s = "" + utils.getMyString()

また

var s = String(utils.getMyString())

これらは、内部変換のおかげで scriptContext から取得できる JavaScript 文字列であるため、すべて問題ありません。

scriptContext から解放されるとき、NativeJavaObjects はアンラップされるべきだと思います (sun.org.mozilla.javascript.internal.Wrapper.unwrap() を参照)。

それで、それはバグですか?java7u5でも同じ問題があります。

私はしなければならないだろうとは信じていません:

var s = String(utils.getMyString())

Java文字列をJavaScript文字列に変換して、Java文字列として戻すことができます...

ご意見ありがとうございます。

4

1 に答える 1

1

問題は次のように思われます: https://stackoverflow.com/questions/11814010/javascript-rhino-java-float-method-returns-number-or-object および Rhino Javascript: オブジェクトを Javascript プリミティブに変換する方法は?

しかし、あなたの場合、私はそれを信じています:

Context.enter().getWrapFactory().setJavaPrimitiveWrap(false); 

NullPointerException をスローします。JDK javax.script から Rhino を使用し、ScriptEngine.eval メソッドがコンテキスト (コンテキストの開始、終了など) を処理するすべての操作をラップするため、eval の前に上記のコードを呼び出すと、rhino コンテキストが初期化されない場合があります (enter method assign context to現在のスレッド)。

解決策として、Rhino を org.mozilla から直接使用し、コンテキストを直接処理することが考えられ ます。コンテキストに入ると、上記のコードをリンクして呼び出します。

JDK ScriptEngine を使用したときに同様の問題 (およびその他の問題) が発生し、Rhino フォーム mozilla を使用して解決しました。

于 2012-09-06T23:01:14.957 に答える