что такое инвертор загрузчика - PullRequest
3 голосов
/ 02 ноября 2011

Кто-нибудь может объяснить, пожалуйста, следующий абзац из "основного тома Java II, 8-й выпуск", стр. 759:

Код вашего приложения содержит вспомогательный метод, который вызывает Class.forName(classNameString).

Этот метод вызывается из класса плагина.

classNameString указывает класс, который содержится в плагине JAR.

Автор плагина имеет обоснованное ожидание, что класс должен быть загружен. Однако класс вспомогательного метода был загружен системный загрузчик классов, и это загрузчик классов, используемый Class.forName. Классы в плагине JAR не видны. это явление называется инверсией загрузчика классов ...

Насколько я понимаю, если "класс вспомогательного метода был загружен загрузчиком системного класса", тогда jar плагина, в котором он находится, должен быть помещен в CLASSPATH, а также, если "classNameString указывает класс, содержащийся в JAR плагина "тогда эти два класса должны быть в одном и том же файле jar, который находится в CLASSPATH, тогда почему" Классы в JAR плагина не видны "

Ответы [ 2 ]

3 голосов
/ 02 ноября 2011

Это перефразировано из старой книги Halloway «Разработка компонентов для платформы Java» (которую я все еще рекомендую).

Класс приложения Main может ссылаться на java.lang.String, хотя Main происходит отclasspath class loader и String поставляется с загрузчиком начальной загрузки.

String, однако не может ссылаться на Main, поскольку загрузчик classpath не является частью делегации загрузчика начальной загрузки. Класс из родительского загрузчика не может ссылаться на класс из дочернего загрузчика.

Это то же самое, что и ваш пример;Загрузчик классов PluginMain может вызвать Helper, потому что Helper был загружен загрузчиком родительского класса.Но Helper не может см. PluginWidget, поскольку класс виджета был загружен загрузчиком классов child .

3 голосов
/ 02 ноября 2011

Скажем, класс Helper.class находится в core.jar, который находится в CLASSPATH и загружается загрузчиком системных классов.

PluginMain.class и PluginWidget.class находятся в plugin.jar, но plugin.jar нет в CLASSPATH.

Как часть системы плагинов, плагин создает новый загрузчик классов с именем PluginClassLoader, использует его для загрузки PluginMain.class из plugin.jar и вызывает PluginMain.start ().

Инверсия загрузчика классов происходит, если PluginMain.start () вызывает Helper.deluxeLoadClass («PluginWidget.class»), а deluxeLoadClass () в конечном итоге вызывает Class.forName («PluginWidget.class»).Это терпит неудачу, потому что Helper.class был загружен загрузчиком системного класса, который не может видеть PluginWidget.class, так как загрузчик системного класса не имеет plugin.jar в своем classpath.

Пример немного надуманный, но такие вещи происходят чаще в контейнерах J2EE, которые используют иерархии загрузчиков сложных классов .

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