javascript如何访问Nashorn中扩展类的实例
我试图通过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
中引用,该方法由构造函数调用,这导致myInstance
在调用myMethod
时未定义
我很难找到一种方法来解决这个问题,而不必通过Java进行扩展,这会在我工作的环境中造成问题
编辑:
我无法更改MyClass
中的Java代码
# 1 楼答案
“myInstance”仅在JS“new”操作完成后初始化。这个JS“new”包括“新对象创建”和“Java构造函数调用”(来自单个invokedynamic)
您提到要从(超类)构造函数调用myMethod。在本例中,您实际上是从超类构造函数调用脚本实现的myMethod方法重写。但脚本常量myInstance尚未初始化。因此,当您尝试使用Java时,将出现错误。超级对我的实例,这仍然是未定义的
问题的根源:
从构造函数调用可重写的Java方法不是一个好主意。我建议您重新构造java代码,以避免从构造函数调用可重写的方法