我如何重新实例化 javascript 实例化的 class (Nashorn 引擎)

how can I re-instantiate a class instanced by javascript (Nashorn Engine)

所以,我在 javascript 中实例化了一个新的 class,然后将其添加到列表中......稍后我遍历列表并再次实例化所有 classes , 与他们一起工作。

Java脚本:

var BPmanager = Java.type('paperVS.tabs.blueprint.BlueprintManager');
var abstractFunction= Java.extend(Java.type('paperVS.logic.function.Function'));

var getYPos = new abstractFunction("getYPos") {

   //Some Functions
}

BPmanager.allFunctions.add(getYPos);

以后 Java:

for (Function fun : allFunctions) { 
     try {
        Class<?> c = Class.forName(fun.getClass().getName());
        Object object = c.newInstance();
        instances.add((Function)object);
    } catch (Exception e) {
        e.printStackTrace();
    }
}

异常:

java.lang.ClassNotFoundException: jdk.nashorn.javaadapters.paperVS_logic_function_Function
    at java.base/jdk.internal.loader.BuiltinClassLoader.loadClass(BuiltinClassLoader.java:602)
    at java.base/jdk.internal.loader.ClassLoaders$AppClassLoader.loadClass(ClassLoaders.java:178)
    at java.base/java.lang.ClassLoader.loadClass(ClassLoader.java:521)
    at paperVS.tabs.blueprint.BlueprintManager.getFromList(BlueprintManager.java:176)

此代码适用于除 Java 脚本 class 之外的所有 classes。 Java 脚本工作正常(加载和执行单个实例),但不是 Class 的实例化。正常的 ClassLoader 做同样的事情

Java ClassLoaders 使用委托模型,其中系统实例化“原始”(或“系统”)class 加载程序,然后 class 加载程序可以创建在 classes 的专门位置查找,如果找不到,则在祖先(或委托)class 加载器中查找。

Nashorn 有自己的内部 class 加载程序来处理脚本 classes;参见 。所以你在 those class 加载器中创建 classes,然后尝试在祖先 class 加载器中使用它们(你可以在堆栈跟踪)按名称。

所以这是一个需要解决的问题。

另一个是 Java.extend 创建的这些类型是 Nashorn 管理的对象,绑定到特定的 Nashorn 脚本上下文,并且不方便从其他 Java 代码使用(见下面的评论, OP 指出 classes 不能轻易使用,即使它们可以访问)。

如果您想在 Java 代码中使用 Java 脚本创建的对象,您需要创建 Java 对象 然后将它们传递回 Java。您似乎正在这样做,所以也许您只是错误地使用了它们。根据您的 class 姓名等进行猜测,我猜测而不是:

Class<?> c = Class.forName(fun.getClass().getName());
Object object = c.newInstance();
instances.add((Function)object);

...你可能只想要这样的东西:

instances.add((Function)fun);