【问题标题】:java nashorn accessing superclass membersjava nashorn访问超类成员
【发布时间】:2023-04-04 17:56:01
【问题描述】:

我正在使用 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 中我创建对象实例并调用 init 方法,但字段“name”为空。

我也尝试过使用 Java.super(extended ).setName("name");但这引发了异常&lt;eval&gt;:7 TypeError: Cannot call undefined

如何从 javascript 和 nashorn 访问超类成员?

【问题讨论】:

    标签: java superclass nashorn


    【解决方案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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-01-09
      • 2022-11-30
      • 2016-09-06
      • 2016-05-22
      • 2012-12-01
      • 2016-12-16
      • 2013-06-08
      • 2021-03-25
      相关资源
      最近更新 更多