2013-05-01 2 views
1

Я использую javax.script.* с Rhino для написания сценариев в Java-программе.Создание экземпляра класса в интерпретаторе Rhino в Java Scripting

Сценарий может реализовывать интерфейс просто отлично, но когда я пытаюсь использовать аналогичный синтаксис для создания абстрактного класса (давая определения для нереализованных методов), я получаю сообщение об ошибке MyTestAbstractClass (класс, который я пытаюсь создать) является интерфейсом или абстрактным. Я делаю что-то очень плохое?

Это код Javascript Я использую:

var testObject = new foo.mytestpackage.TestAbstractClass() { 
    printMessage: function() { 
     print("foo"); 
    } 
}; 

Когда TestAbstractClass является класс с нормальным конструктор (без параметров), я получаю следующую трассировку стека:

javax.script.ScriptException: sun.org.mozilla.javascript.internal.EvaluatorException: error instantiating (JavaAdapter: first arg should be interface Class (<Unknown source>#1)): class com.merkle.TestObject is interface or abstract (<Unknown source>#1) in <Unknown source> at line number 1 
    at com.sun.script.javascript.RhinoScriptEngine.eval(Unknown Source) 
    at com.sun.script.javascript.RhinoScriptEngine.eval(Unknown Source) 
    at javax.script.AbstractScriptEngine.eval(Unknown Source) 

Я используя Sun (немного упрощенное, как я слышал) внедрение Rhino и использование официальных баннеров Rhino - это то, чего я бы хотел избежать, поскольку они довольно большие.

ответ

2

Oracle, release notes for Java 7's JavaScript Engine предполагают, что инстанцирование абстрактных типов не поддерживаются:

Носорог JavaAdapter был отменен. JavaAdapter - это функция, с помощью которой Java-класс может быть расширен с помощью JavaScript и Java-интерфейсов, которые могут быть реализованы с помощью JavaScript. Мы заменили Rhino JavaAdapter нашей собственной реализацией JavaAdapter. В нашей реализации только объект Java-интерфейса может быть реализован объектом JavaScript.

Это, кажется, подтверждается сообщением об ошибке:

JavaAdapter: first arg should be interface Class (<Unknown source>#1) 

Вы должны реализовать тип в Java и потребляют реализацию, если вы не готовы переключиться двигателей.

+0

Не могли бы вы пояснить «потреблять реализацию»? – hexafraction

+0

Я имею в виду, что вам нужно будет написать не-абстрактный класс (например, 'Foo') в Java, расширяющий абстрактный тип, а затем просто используйте это в своем коде Rhino (например,' var f = new Foo(); ') – McDowell

+0

Ah , ОК. Поэтому я мог бы также, если бы мне нужны абстрактные методы, пройти в нужный интерфейс? Может ли интерфейс быть вложенным типом? – hexafraction