2015-03-24 3 views
1

Я знаю, что я могу расширить абстрактные классы и интерфейсы через Java.extend, но как я могу добавить собственные методы, конструкторы и поля в классе? Я попытался это сделать, но это не работает:Как объявить класс в Java Nashorn?

var MyClass = Java.extend(java.lang.Object, { 
    myField1: java.lang.String, 
    myField2: java.lang.Object, 
    "<init>": function(arg1, arg2) { 
     // Try to declare constructor 
    }, 
    myMethod: function(arg1, arg2, arg3) { 
     // Try to declare method 
    } 
}); 
+0

Какая ошибка вы получаете? Я просто запустил JavaScript, который вы опубликовали выше, из приложения Java, используя ScriptEngine.eval(), используя Intellij Idea, и он прошел отлично. – skomisa

ответ

1

Как утверждает А. Сундарараджан, вы не можете добавлять новые функции в свой расширенный класс. Но почему?

Я подозреваю, что это из-за того, как Nashorn реализует классы, созданные с использованием Java.extend(). Если вы добавите заявление print (MyClass.class) в конце вашего скрипта, вы увидите, что тип вашего класса «jdk.nashorn.javaadapters. java.lang.Object», класс, который определен в Нашорне, и очень маловероятно указать ту же настройку, которую вы добавили при определении расширенного класса.

Так что (предположительно) во время выполнения любая добавленная вами настройка, за исключением переопределения, не будет известна Нашорну. Документация Nashorn подразумевает это ограничение, но, насколько я знаю, явно не раскрывает его. См. Вопрос this, связанный с переполнением стека, для получения дополнительной информации.

1

Вы не можете добавить новый метод в подкласс. Вы не можете определить новый конструктор (более похожий на использование анонимного класса в Java-коде). Вы можете переопределить метод супер класса (или реализовать методы супер-интерфейса).

+0

Похоже, вы правы - вы можете добавить неперехватывающие методы в новый подкласс в вашем скрипте, но вы не можете их вызывать: Nashorn выдает «нет такой функции» ScriptException. Вы знаете ссылку в документации Nashorn, в которой указано это ограничение? – skomisa