Мне нужны разные загрузчики классов, чтобы иметь возможность разгружать классы. Но мне нужно обмениваться объектами между ними (на самом деле я получаю ClassCastException). Итак, каковы решения, чтобы справиться с этим?. Благодаря
Как обмениваться объектами между разными загрузчиками классов?
Ответ 1
Объекты из разных загрузчиков классов могут взаимодействовать друг с другом через интерфейсы и классы, загруженные обычным загрузчиком классов.
Ответ 2
Одной из основных целей использования отдельных загрузчиков классов является предотвращение именно того, что вы пытаетесь сделать. Безопасность и конфликты имен являются вескими причинами для сохранения этой изоляции. Вот несколько способов, которыми вы можете обойти эту изоляцию.
-
Использование загрузчика Common Class
-
Обмен библиотеками через кластер
-
Упаковка клиентского JAR для одного приложения в другом Применение
Подробнее см. ссылку .
Ответ 3
Также отметим, что если вы используете интерфейсы, вы можете использовать java.lang.reflect.Proxy для создания экземпляра интерфейса, локального для вашего загрузчика классов, который под капотом делает вызовы с отражением "реальным" ( чужой) объект от другого загрузчика классов. Это уродливо, и если параметры или типы возврата не являются примитивными, вы просто передадите ClassCastException дальше по строке. Хотя вы можете пристроить что-то для выполнения этой работы, в общем, лучше иметь либо родительский загрузчик классов с некоторыми общими типами, которые вы хотите использовать в загрузчиках классов, или использовать более... сериализованный формат для связи ( медленнее) или использовать только интерфейсы, которые имеют дело с примитивами.