Совместное использование классов Java несколькими загрузчиками классов - PullRequest
0 голосов
/ 25 мая 2018

У меня есть случай использования, когда мне нужно динамически загружать и делиться предопределенным набором пакетов / классов между несколькими загрузчиками классов.Наша цель - повысить общую производительность при каждой загрузке файла JAR.

Мы пытаемся загрузить и запустить «приложения».Каждое приложение содержит наши библиотеки SDK.Каждое загруженное приложение выполняется в своем собственном URLClassLoader, чтобы изолировать его от другого кода, а также предотвратить конфликт версий библиотеки.Поскольку наши библиотеки SDK находятся в каждом приложении, мы хотели бы кэшировать эти конкретные наборы пакетов / классов, чтобы в следующий раз при загрузке другого приложения не нужно было снова загружать все классы SDK, что устраняет эти накладные расходы..

Поскольку у нас есть несколько версий нашего SDK, мы пытаемся сделать это динамически.Так что, когда приложение загружено, мы уже знаем, какая это версия SDK.Таким образом, мы хотели бы иметь некоторую реализацию родительского Classloader, которая специфична для этой версии SDK (мы будем называть его SDKCacheClassLoader).Когда URLClassLoader (или какой-то его собственный подкласс) загружается и распознает пакет / класс из sdk, мы хотим перенаправить этот класс в общий родительский SDKCacheClassLoader.Затем, в следующий раз, когда мы загрузим другой файл JAR с URLClassLoader (установив SDKCacheClassLoader в качестве общего родительского загрузчика классов), родительский объект уже должен найти этот класс и загрузить из последнего выполнения, и новый файл JAR не должен сканироваться в поискахснова классы SDK.

У кого-нибудь есть какие-либо идеи о том, как достичь этой цели?

Кроме того, чтобы было ясно, мне не нужно обмениваться экземплярами, просто определение класса, так как японимать, что JVM рассматривает одни и те же классы, загруженные двумя разными загрузчиками классов, как совершенно разные классы.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...