Как объявить класс в Java Nashorn?

1

Я знаю, что я могу расширять абстрактные классы и интерфейсы через 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
    }
});
  • 0
    Какую ошибку вы получаете? Я только что запустил JavaScript, который вы опубликовали выше, из Java-приложения, используя ScriptEngine.eval (), используя Intellij Idea, и он работал нормально.
  • 0
    где документация для метода <init>, действующего как конструктор? Я охотился за этим, но не смог его найти.
Теги:
class
nashorn

2 ответа

1
Лучший ответ

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

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

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

1

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

  • 0
    Похоже, что вы правы - вы можете добавить не переопределяющие методы к новому подклассу в вашем скрипте, но не можете их вызывать: Nashorn генерирует исключение ScriptException «no such function». Знаете ли вы ссылку в документации Nashorn, в которой говорится об этом ограничении?

Ещё вопросы

Сообщество Overcoder
Наверх
Меню