как я могу повторно создать экземпляр класса с помощью 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 делает то же самое


person Plixo    schedule 28.12.2020    source источник


Ответы (1)


В Java ClassLoader используется модель делегирования, когда система создает экземпляр первичного (или системного) загрузчика классов, а затем могут быть созданы загрузчики классов, которые ищут классы в специализированных местах и, если не найдены, ищут в загрузчике классов-предков (или делегатов). .

У Nashorn есть собственные внутренние загрузчики классов для работы с классами сценариев; см. Java 8 ScriptEngine для ClassLoaders. Итак, вы создаете классы в этих загрузчиках классов, а затем пытаетесь использовать их в загрузчике классов-предков (вы можете видеть это в трассировке стека) по имени.

Так что это одна проблема, которую нужно решить.

Другой заключается в том, что эти типы, созданные Java.extend, являются объектами, управляемыми Nashorn, привязанными к определенному контексту сценария Nashorn, и их будет неудобно использовать из другого кода Java (см. комментарии ниже, где OP отмечает, что классы не могут быть легко использованы , даже если они доступны).

Если вы хотите использовать объекты, созданные с помощью JavaScript, в коде Java, вам потребуется создать объекты Java, а затем передать их обратно в Java. Кажется, вы делаете это, поэтому, возможно, вы просто используете их неправильно. Делая догадки на основе имен ваших классов и т. д., я предполагаю, что, а не:

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

... вы можете просто захотеть что-то вроде:

instances.add((Function)fun);
person David P. Caldwell    schedule 28.12.2020
comment
Спасибо.... теперь, к сожалению, у меня другая проблема. Как создать экземпляр функции? Класс Function имеет один конструктор (строку). Новый класс имеет три разных конструктора (java.lang.String, jdk.nashorn.internal.runtime.ScriptFunction), (java.lang.String, java.lang.Object) и (java.lang.String, jdk.nashorn. внутренний.runtime.ScriptObject) - person Plixo; 28.12.2020
comment
Да, так что... JavaScript должен владеть этими объектами, и поэтому они существуют в определенном контексте JavaScript. Итак, если вы действительно хотите создавать объекты Java с помощью JavaScript, обратите внимание на механизм Java.extend, который позволяет вам реализовать абстрактный класс/интерфейс Java с объектом JavaScript. См. wiki.openjdk.java.net/display/Nashorn/Nashorn+extensions - person David P. Caldwell; 28.12.2020
comment
Я обновил свой ответ, чтобы отразить дополнительное понимание вопроса и того, что вы пытаетесь сделать. Надеюсь, это сработает! - person David P. Caldwell; 28.12.2020
comment
Спасибо еще раз. Если мне нужен новый экземпляр, я просто позволю Javascript создать его снова :( - person Plixo; 28.12.2020