Итак, я создаю экземпляр нового класса в javascript, а затем добавляю его в список ... Позже я просматриваю список и снова создаю экземпляры всех классов, чтобы работать с ними. Javascript: var BPmanager = Java ....

0
Plixo 28 Дек 2020 в 18:56

1 ответ

Лучший ответ

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

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

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

Во-вторых, эти типы, созданные Java.extend, являются объектами, управляемыми Нэшорном, привязанными к конкретному контексту сценария Нэшорна, и их будет неудобно использовать из другого кода 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);
0
David P. Caldwell 28 Дек 2020 в 18:10