微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

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

如何解决如何重新实例化由 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 做同样的事情

解决方法

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);

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。