sun.org.mozilla Rhino и расширяющие абстрактные классы Java - PullRequest
5 голосов
/ 26 января 2011

В версии Rhino sun.org.mozilla, JavaAdapter принимает интерфейсы только в качестве первого аргумента вместо любого другого типа класса согласно этому сообщению об ошибке:

javax.script.ScriptException: sun.org.mozilla.javascript.internal.EvaluatorExcep
tion: JavaAdapter: first arg should be interface Class (<Unknown source>#11) in
<Unknown source> at line number 11

Есть ли способ, каким бы хакерским он ни был, расширять абстрактный класс (или обычный класс в этом отношении) через Rhino?

Вот код нарушения:

var j = new JavaAdapter(foo.bar.abstractClass, {
    field : "test",
    method : function () {
        print("on enable");
    }
});

1 Ответ

7 голосов
/ 17 июля 2011

Другой ответ верен для Sun версии Rhino.Из формулировки вопроса не совсем понятно, является ли переход на оригинальный (Mozilla) Rhino подходящим для вас вариантом.

В частности, когда Sun добавила Rhino в Java, " некоторые компоненты имеютбыл исключен из-за занимаемой площади и по соображениям безопасности", и одним из них был JavaAdapter Mozilla.Sun написала свой собственный «JavaAdapter», но он намного меньше и проще, чем Mozilla, и его можно использовать только для реализации одного интерфейса Java.Оригинальный JavaAdapter в Mozilla не имеет такого ограничения: я использую его для постоянной реализации абстрактных классов.

Он не имеет ничего общего с неким смутным философским отличием, таким как "JavaScript на самом деле не" OO "так же, какДжава".Sun решила, что «Использование JavaAdapter для расширения класса Java или для реализации нескольких интерфейсов очень редко» (ibid), и решила удалить эту функцию.

Если допустимо поставлять jar-файл объемом 850 КБ с вашим кодомЗатем возьмите Mozilla Rhino и реализуйте все нужные вам абстрактные классы!

...