如何在 Java Nashorn 中声明 class?

How to declare class in Java Nashorn?

我知道我可以通过 Java.extend 扩展抽象 classes 和接口,但是如何在 class 中添加自定义方法、构造函数和字段?我试着喜欢这个,但它不起作用:

var MyClass = Java.extend(java.lang.Object, {
    myField1: java.lang.String,
    myField2: java.lang.Object,
    "<init>": function(arg1, arg2) {
        // Try to declare constructor
    },
    myMethod: function(arg1, arg2, arg3) {
        // Try to declare method
    }
});

您不能向 subclass 添加新方法。您不能定义新的构造函数(更像是 Java 代码中的匿名 class 用法)。您只能重写 super class 方法(或实现 super 接口方法)。

正如 A. Sundararajan 正确指出的那样,您不能向扩展 class 添加新功能。但为什么?

我怀疑这是因为 Nashorn 如何实现使用 Java.extend() 创建的 classes。如果在脚本末尾添加语句 print(MyClass.class),您可以看到 class 的类型是 "jdk.nashorn.javaadapters.java.lang.Object",一个class 在 Nashorn 中定义,并且不太可能指定您在定义扩展 class 时添加的相同自定义。

因此(大概)在 运行 时间,您添加的任何定制(不包括覆盖)都不会被 Nashorn 所知。 Nashorn 文档暗示了此限制,但据我所知并未明确说明。有关详细信息,请参阅 this 相关的 Stack Overflow 问题。