所以,我用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可以正常工作(加载和执行单个示例),但不能示例化类。普通的类加载器也是这样做的
1条答案
按热度按时间5q4ezhmt1#
java
ClassLoader
s使用委托模型,其中系统示例化“原始”(或“系统”)类装入器,然后可以创建类装入器,在专用位置查找类,如果找不到,则查找祖先(或委托)类装入器。nashorn有自己的内部类装入器来处理脚本类;请参阅Java8ScriptEngine跨类加载器。因此,您在这些类装入器中创建类,然后尝试按名称在祖先类装入器(您可以在堆栈跟踪中看到)中使用它们。
所以这是一个需要解决的问题。
另一个原因是
Java.extend
是nashorn管理的对象,绑定到特定的nashorn脚本上下文,从其他java代码使用起来很不方便(参见下面的注解,op注意到这些类不容易使用,即使它们是可访问的)。如果您想在java代码中使用javascript创建的对象,您需要创建java对象,然后将它们传递回java。你似乎在这样做,所以也许你只是用错了。根据你的类名等进行猜测,我是在猜测,而不是:
... 您可能只需要以下内容: