1

私はMozillaのRhinoの実装を使用しています(JDKにバンドルされているものではありません)。このスレッドを読んだこと:Rhinoで内部(静的)クラスをサブクラス化する方法は?-私は正しい方向に進んでいると思いましたが、次の実装は失敗します:

Exception in thread "main" org.mozilla.javascript.EvaluatorException: Access to Java class "adapter1" is prohibited. (test#2)
at org.mozilla.javascript.DefaultErrorReporter.runtimeError(DefaultErrorReporter.java:77)
at org.mozilla.javascript.Context.reportRuntimeError(Context.java:913)
at org.mozilla.javascript.Context.reportRuntimeError(Context.java:969)
at org.mozilla.javascript.Context.reportRuntimeError1(Context.java:932)
at org.mozilla.javascript.JavaMembers.<init>(JavaMembers.java:35)
at org.mozilla.javascript.JavaMembers.lookupClass(JavaMembers.java:807)
at org.mozilla.javascript.NativeJavaObject.initMembers(NativeJavaObject.java:54)
at org.mozilla.javascript.NativeJavaObject.<init>(NativeJavaObject.java:44)
at org.mozilla.javascript.JavaAdapter.createAdapterWrapper(JavaAdapter.java:107)
at adapter1.<init>(<adapter>)
at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:57)
at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45)
at java.lang.reflect.Constructor.newInstance(Constructor.java:525)
at org.mozilla.javascript.JavaAdapter.js_createAdapter(JavaAdapter.java:205)
at org.mozilla.javascript.JavaAdapter.execIdCall(JavaAdapter.java:86)
at org.mozilla.javascript.IdFunctionObject.call(IdFunctionObject.java:97)
at org.mozilla.javascript.BaseFunction.construct(BaseFunction.java:343)
at org.mozilla.javascript.ScriptRuntime.newObject(ScriptRuntime.java:2349)
at org.mozilla.javascript.gen.test_1._c_script_0(test:2)
at org.mozilla.javascript.gen.test_1.call(test)
at org.mozilla.javascript.ContextFactory.doTopCall(ContextFactory.java:394)
at org.mozilla.javascript.ScriptRuntime.doTopCall(ScriptRuntime.java:3091)
at org.mozilla.javascript.gen.test_1.call(test)
at org.mozilla.javascript.gen.test_1.exec(test)

Java:

package com.rebelstudios.scripting;

public abstract class Test
{
    public abstract void x();

public static void main(String[] _) throws Throwable
{
    Context cx = Context.enter();
    ScriptableObject prototype = cx.initStandardObjects();
    Scriptable topLevel = new ImporterTopLevel(cx);
    prototype.setParentScope(topLevel);
    Scriptable scope = cx.newObject(prototype);
    scope.setPrototype(prototype);
    Reader reader = new FileReader("test.js");
    org.mozilla.javascript.Script script = cx.compileReader(reader, "test", 0, null);
    script.exec(cx,  scope);
}

}

JS:

var derived = new JavaAdapter(
    Packages.com.rebelstudios.scripting.Test, 
    {
        x: function() { }
    }
);

かなり遅く、明らかな何かが欠けているかもしれませんが、誰かがいくつかのヒントを提供できますか?ありがとう!

PSまた、Mozilla Rhinoの使用に関する優れたドキュメント、例、チュートリアルへのリンクもありがたいです。私が検索から集めたものから、そこにはあまり首尾一貫した情報がないようです。

4

1 に答える 1

0

JavaAdaperを使用する必要はありません。インスタンス化するクラスを明示的に宣言することもできますが、Rhinoはコードウィービングなどの魔法を作らないため、このクラスはリフレクションを介してインスタンス化できる必要があります。

Rhinoでのサブクラス化/拡張に関する関連記事をここで読むことができます:rhinoのJavaAdapterを使用した例

また、MongoDBの次のRhinoのアダプターでBSON.fromBSON.toなどの意味でJavaオブジェクトとの間でScriptableオブジェクト(js-scriptの実行中に作成された)をラップすることを検討することもできます: http://code.google。 com / p / mongodb-rhino /

于 2013-03-21T07:23:19.360 に答える