如何重新示例化javascript示例化的类(nashorn引擎)

t1rydlwq  于 2021-06-29  发布在  Java
关注(0)|答案(1)|浏览(569)

所以,我用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可以正常工作(加载和执行单个示例),但不能示例化类。普通的类加载器也是这样做的

5q4ezhmt

5q4ezhmt1#

java ClassLoader s使用委托模型,其中系统示例化“原始”(或“系统”)类装入器,然后可以创建类装入器,在专用位置查找类,如果找不到,则查找祖先(或委托)类装入器。
nashorn有自己的内部类装入器来处理脚本类;请参阅Java8ScriptEngine跨类加载器。因此,您在这些类装入器中创建类,然后尝试按名称在祖先类装入器(您可以在堆栈跟踪中看到)中使用它们。
所以这是一个需要解决的问题。
另一个原因是 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);

相关问题