java nashorn доступ к членам суперкласса

Я работаю с движком nashorn, я пытаюсь расширить следующий класс Java

public abstract class AbstractClass {
    protected String name;
    protected long id;

public String getName() {
    return name;
}
public void setName(String name) {
    this.name = name;
}
public long getId() {
    return id;
}
public void setId(long id) {
    this.id = id;
}
public void init() {

}

Код Javascript: в методе init () я хочу получить доступ к членам суперкласса (напрямую установить значение защищенных полей или использовать общедоступные сеттеры)

var extended = Java.extend(AbstractClass.static , {
    init: function() {
        extended.name = "name"; //name is null
        setName("name") //exception <eval>:6 ReferenceError: "setName" is not defined
    }
});

В java я создаю экземпляр объекта и вызываю метод инициализации, но поле «name» имеет значение null.

я также пробовал использовать Java.super (расширенный) .setName ("name"); но это вызвало исключение <eval>:7 TypeError: Cannot call undefined

Как я могу получить доступ к членам суперкласса из javascript и nashorn?


person hnnn    schedule 02.08.2015    source источник


Ответы (1)


Java.extend создает подкласс, а не экземпляр подкласса. Но Java.super требует в качестве аргумента экземпляр подкласса. Итак, работает следующий скрипт:

var extended = new (Java.extend(Java.type("AbstractClass"))) {
    init: function() {
        Java.super(extended).setName("foo");
    }
};

extended.init();
print(extended.name);

Несколько более крупный пример использования Java.super находится здесь

https://wiki.openjdk.java.net/display/Nashorn/Nashorn+extensions#Nashornextensions-java_super

person A. Sundararajan    schedule 03.08.2015