如何重新实例化由 javascript (Nashorn Engine) 实例化的类

因此,我在 javascript 中实例化了一个新类,然后将其添加到列表中……稍后我遍历列表并再次实例化所有类,以使用它们。

Javascript:

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)

此代码适用于除 Javascript 类之外的所有类。 Javascript 工作正常(加载和执行单个实例),但不能实例化类。普通的 ClassLoader 做同样的事情

wxw398800941 回答:如何重新实例化由 javascript (Nashorn Engine) 实例化的类

Java ClassLoader 使用委托模型,其中系统实例化“原始”(或“系统”)类加载器,然后可以创建类加载器,在专门的位置查找类,如果没有找到,查看祖先(或委托)类加载器。

Nashorn 有自己的内部类加载器来处理脚本类;见Java 8 ScriptEngine across ClassLoaders。因此,您正在那些类加载器中创建类,然后尝试在祖先类加载器(您可以在堆栈跟踪中看到)中按名称使用它们。

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

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

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

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

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

instances.add((Function)fun);
本文链接:https://www.f2er.com/1188721.html

大家都在问