有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

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) 个答案

  1. # 1 楼答案

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

    您提到要从(超类)构造函数调用myMethod。在本例中,您实际上是从超类构造函数调用脚本实现的myMethod方法重写。但脚本常量myInstance尚未初始化。因此,当您尝试使用Java时,将出现错误。超级对我的实例,这仍然是未定义的

    问题的根源:

    从构造函数调用可重写的Java方法不是一个好主意。我建议您重新构造java代码,以避免从构造函数调用可重写的方法