Я знаю, что я могу расширять абстрактные классы и интерфейсы через Java.extend
, но как я могу добавить собственные методы, конструкторы и поля в классе? Я попытался это сделать, но это не работает:
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
}
});
Как правильно утверждает А. Сундарараджан, вы не можете добавлять новые функции в свой расширенный класс. Но почему?
Я подозреваю это из-за того, как Nashorn реализует классы, созданные с использованием Java.extend(). Если добавить оператор печати (MyClass.class) в конце сценария вы можете увидеть, что тип вашего класса "jdk.nashorn.javaadapters. Java.lang.Object", класс, который определен в Nashorn, и очень маловероятно указать ту же настройку, которую вы добавили при определении расширенного класса.
Таким образом (предположительно) во время выполнения любая добавленная вами настройка, за исключением переопределения, не будет известна нам. Документация Nashorn подразумевает это ограничение, но, насколько я знаю, явно не раскрывает его. См. Этот связанный вопрос для получения дополнительной информации.
Вы не можете добавить новый метод в подкласс. Вы не можете определить новый конструктор (более похожий на использование анонимного класса в Java-коде). Вы можете переопределить метод супер класса (или реализовать методы супер-интерфейса).