我正在使用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()方法中,我想访问超类成员(直接设置受保护字段的值或使用公共setter)
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(扩展). setName("name");但这抛出了一个异常
如何从javascript和nashorn访问超类成员?
JAVAextend创建一个子类,而不是子类实例。但是爪哇。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扩展#Nashornextensions-java#u super
我正在阅读这本Java SCJP的书,我偶然发现了以下内容: 但是我得到了这个错误: 那么,出什么问题了?
问题内容: 我想对此进行一些讨论,但无法推断出我的情况的答案。仍然需要帮助。 这是我的代码: 在上面的示例中,下面的一些定义似乎令人困惑: 问题: 为什么我不能从子类实例(对象)访问受保护的成员()? 问题答案: 作为声明类的子类的其他包中的类只能访问其自己的继承成员。 …但不是其他对象的继承成员。
类的数据成员(类定义中声明的变量)和成员函数(类定义中声明的函数)属于该类的类范围(class's scope)。非成员函数在文件范围(file scope)中定义。 在类范围中,类成员可由该类的所有成员函数直接访问,也可以用名称引用。在类范围外,类成员是通过一个对象的句柄引用,可以是对象名、对象引用或对象指针(第7章将介绍,每次引用对象中的数据成员和成员函数时,编译器插入一个隐式句柄)。 类的成
问题内容: 众所周知,私有字段不会在类之间继承。令我着迷的是它如何用于内部静态类。考虑以下代码: 您能否解释一下如何访问其他内部类的私有字段?如果合法,为什么只能通过“ super.XXX”构造实现? 问题答案: 内部类是Java的较晚入门。添加它们时,它们仅作为编译器扩展添加,对JVM不变。 语言规范指出,内部类被允许访问在其内声明的类的私有成员。包括其他内部类。 为了使其工作,编译器会生成桥接
我的子类是,我需要在我的超类中使用字段和。我知道如何在子类中使用超类变量,但我必须学会如何做相反的事情?谢谢。
我认为内部类的成员,即使被声明为私有的,也可以从它的封闭类中访问。但是我遇到了以下代码结构的编译时错误。我的顶级类实现了Iterable接口。Iterator在内部类中实现。当内部类的一个实例通过iterator()方法获得时,我无法使用该实例访问数据栏。 有什么建议吗?