我正在尝试通过JavaScript Nashorn扩展Java类,然后从超类中调用方法。通常情况下这不会是一个问题,尽管我正在重写一个方法,这个方法被超类的构造函数调用。
以下是我的代码:
const MyClass = Java.type("com.example.MyClass")
const myInstance = new (Java.extend(MyClass, {
myMethod: () => {
const _super = Java.super(myInstance)
_super.doWhatever()
}
}))()
我将变量myInstance
设置为扩展类的新实例,该实例再次从方法myMethod
中引用,该方法由构造函数调用,这会导致{{1}调用时间myInstance
时未定义。
我无法找到解决此问题的方法,而无需通过Java扩展它,这会导致我工作的环境出现问题。
修改
我无法在myMethod
答案 0 :(得分:0)
“myInstance”仅在JS“new”操作完成后初始化。这个JS“new”一起涉及“新对象创建”和“Java构造函数调用”(来自单个invokedynamic)。
你提到你从你的(超类)构造函数中调用myMethod。在这种情况下,您实际上是从超类构造函数调用脚本实现的myMethod方法覆盖。但脚本常量myInstance尚未初始化。所以当你在myInstance上尝试Java.super时,你会得到错误,这仍然是未定义的!
问题的根源:
从构造函数中调用可覆盖的Java方法并不是一个好主意。我建议你重构你的java代码,以避免从构造函数调用一个可覆盖的方法。