如何在Nashorn

时间:2017-02-28 23:41:33

标签: javascript java 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中引用,该方法由构造函数调用,这会导致{{1}调用时间myInstance时未定义。

我无法找到解决此问题的方法,而无需通过Java扩展它,这会导致我工作的环境出现问题。

修改
我无法在myMethod

中更改Java代码

1 个答案:

答案 0 :(得分:0)

“myInstance”仅在JS“new”操作完成后初始化。这个JS“new”一起涉及“新对象创建”和“Java构造函数调用”(来自单个invokedynamic)。

你提到你从你的(超类)构造函数中调用myMethod。在这种情况下,您实际上是从超类构造函数调用脚本实现的myMethod方法覆盖。但脚本常量myInstance尚未初始化。所以当你在myInstance上尝试Java.super时,你会得到错误,这仍然是未定义的!

问题的根源:

从构造函数中调用可覆盖的Java方法并不是一个好主意。我建议你重构你的java代码,以避免从构造函数调用一个可覆盖的方法。