Mozilla Rhino 1_7R4 Расширение абстрактного класса ( JS)
Я использую реализацию Rhino в Mozilla (а не в комплекте с 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)
Джава:
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. Там, кажется, не так много последовательной информации из того, что я собрал из моих поисков.
1 ответ
Не обязательно использовать JavaAdaper. Вы можете явно объявить класс, который вы собираетесь создать, но этот класс должен быть создан с помощью рефлексии, поскольку Rhino не создает магию, такую как ткачество кода или что-то в этом роде.
Вы можете прочитать связанные статьи о субклассировании / расширении в Rhino здесь: пример с использованием JavaAdapter от Rhino
Вы также можете обернуть ваш объект Scriptable (созданный во время выполнения js-скрипта) из и в объект Java в более низкое значение, например BSON.from и BSON.to, в следующий адаптер Rhino из MongoDB: http://code.google.com/p/mongodb-rhino/