2013-03-19 144 views
1

我正在使用Mozilla的Rhino實現(不是與JDK捆綁在一起的)。看了這個線程:How to subclass an inner (static) class in Rhino? - 我以爲我是在正確的軌道上,但下面執行失敗:Mozilla犀牛1_7R4擴展抽象類(JS)

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() { } 
    } 
); 

這是相當晚,我可能會錯過一些明顯的,但任何人都可以提供一些提示?謝謝!

P.S.我也非常感謝任何有關使用Mozilla Rhino的良好文檔,示例和教程的鏈接。從我的搜索中收集的信息似乎沒有太多連貫的信息。

回答

0

不需要使用JavaAdaper。你可以顯式聲明一個你將要實例化的類,但是這個類必須能夠通過反射來實例化,因爲Rhino不會像編寫代碼那樣做任何魔法。

你可以閱讀有關子類相關文章/犀牛這裏延伸:example using rhino's JavaAdapter

您也可以考慮從並以更猛烈的Java對象包裝您的腳本化對象(JS腳本執行期間創建)像BSON.fromBSON.to在以下犀牛的適配器從MongoDB的:http://code.google.com/p/mongodb-rhino/

+1

感謝您的答覆,但我想知道爲什麼上面的代碼失敗。根據我讀過的文檔和示例,它應該可以工作。 – 2013-03-21 17:32:47