2013-08-29 4 views
5

Я знаю, что иерархия в Java класса погрузчиков:Почему нужны дополнительные загрузчики классов?

класс 1.Bootstrap погрузчик (в машинном коде) загрузчиком класса
2. Extension (sun.misc.Launcher$ExtClassLoader)
3. Класс системы Загрузчик (sun.misc.Launcher$AppClassLoader class)
4 Пользовательские загрузчики классов (например, сервер приложений, загрузчик классов улов, боевой класс)

Мне непонятно, зачем нужны дополнительные погрузчики для дочерних классов. Я мог понять необходимость в загрузчике класса «чистый java» после того, как в собственном коде.
У меня есть некоторые мысли о возможных причинах, но может ли кто-нибудь дать мне четкое объяснение этому поведению/потребности в иерархиях классов-загрузчиков?
В целом, но применимо и для j2ee.

ответ

4

Classloaders полезны для обеспечения разнообразного поведения и защиты различных программ Java, работающих в одной виртуальной машине друг от друга. Существуют три основные категории, которые приходят на ум:

  • Погрузчики классов могут реализовать процесс загрузки классов по-разному. Например, у вас может быть загрузчик классов, который извлекает байт-код для класса с некоторого сервера, а затем устанавливает его в JVM, или у вас может быть загрузчик классов, который фактически generates the bytecode on the fly вместо того, чтобы читать его из файла.
  • Classloaders могут создавать разделы внутри одной JVM, так что разные «деревья» кода могут иметь разные копии классов с одинаковыми именами. Общим примером этого является контейнер сервлетов, такой как Tomcat, где может быть установлено несколько war s, которые имеют разные версии библиотеки (скажем, Apache Commons-Lang). OSGi также использует этот подход, чтобы гарантировать, что каждый пакет может получить доступ только к классам, которые он специально запросил, и не может «пропустить» API.
  • Погрузчики классов могут использоваться для реализации различных политик, касающихся того, когда мусор собирает сами фактические классы. Использование только по умолчанию загрузчика классов держит классы неопределенно долго, что приводит к ужасным ошибкам PermGen; приложение, которое использовало много временных классов (возможно, сгенерированных на лету), возможно, захочет удостовериться, что они были освобождены, когда больше не нужно, используя одноразовые загрузчики классов.
+0

Погрузчики классов необходимы для того, чтобы все классы, к которым они были загружены, были доступны, до тех пор, пока сам класс ClassLoader достигнут.Если вы хотите, чтобы класс собирался раньше, создайте для него специальный экземпляр класса ClassLoader. –

+0

Вы правы; редактирования. – chrylis

0

Я предполагаю, что используемые загрузчики классов зависят от конкретного сервера приложений. Вот документация для Tomcat class loaders.

В Tomcat они по существу создали различные загрузчики классов, которые загружают классы из разных мест. Например, общий загрузчик классов загружает общий lib из $CATALINA_HOME/lib. Каждый загрузчик классов веб-приложений будет загружать классы из соответствующего каталога WEB-INF.

Таким образом, необходимость в загрузчиках классов возникает, главным образом, из-за необходимости загрузки из разных мест, с некоторым правилом приоритета (например, класс от WEB-INF имеет приоритет над CATALINA_HOME/lib). Кроме того, они позволяют загружать различные версии класса в разные загрузчики классов. Например, два веб-приложения могут использовать две разные версии Log4j.

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

Смежные вопросы