如何在JavaNashorn中声明类?

如何在JavaNashorn中声明类?,java,class,nashorn,Java,Class,Nashorn,我知道我可以通过Java.extend扩展抽象类和接口,但如何在类中添加自定义方法、构造函数和字段呢?我试着喜欢这个,但它不起作用: var MyClass = Java.extend(java.lang.Object, { myField1: java.lang.String, myField2: java.lang.Object, "<init>": function(arg1, arg2) { // Try to declare cons

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

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
    }
});
var MyClass=Java.extend(Java.lang.Object{
myField1:java.lang.String,
myField2:java.lang.Object,
“”:函数(arg1、arg2){
//尝试声明构造函数
},
myMethod:函数(arg1、arg2、arg3){
//尝试声明方法
}
});

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

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

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


所以(大概)在运行时,您添加的任何定制(不包括覆盖)都不会为Nashorn所知。Nashorn文档暗示了这一限制,但据我所知,并没有明确说明。有关更多信息,请参阅相关的堆栈溢出问题。

您遇到的错误是什么?我刚刚使用Intellij Idea从一个Java应用程序中使用ScriptEngine.eval()运行了上面发布的JavaScript,它运行得很好。充当构造函数的“”方法的文档在哪里?我一直在寻找这个,但找不到它。看起来你是对的-你可以在脚本中向新的子类添加非重写方法,但你不能调用它们:Nashorn抛出了一个“没有这样的函数”ScriptException。您知道Nashorn文档中有一个链接说明此限制吗?