Вопрос

Может ли кто-нибудь указать мне хороший ресурс или объяснить концепцию загрузчиков классов?Я нашел следующий ресурс по загрузчикам классов http://www.onjava.com/lpt/a/5586 но все равно никакой помощи.Следующие вопросы могут показаться глупыми, но попытки ответить на них всегда меня сбивают с толку.

  • Почему разработчики пишут собственные загрузчики классов, почему бы не вызвать загрузчик классов Bootstrap для вызова ваших собственных классов?Какая необходимость определять собственные загрузчики классов?
  • Почему существует так много разновидностей классных погрузчиков?например:Bootsrap, Comman, загрузчик классов Catalina и т. д.,

    Заранее спасибо.

Это было полезно?

Решение

Я нашел следующие веские причины для создания пользовательских загрузчиков классов:

  1. Вы хотите загрузить класс из нетрадиционного источника (например, байт-код одного класса хранится в базе данных, по сети или переносятся голубями как 0 и 1 - MessengerPidgeonClassLoader).Для таких случаев в API уже есть некоторые реализации ClassLoader, например: URLClassLoader.

  2. Вам необходимо определить другую иерархию для загрузки классов.Реализации ClassLoader по умолчанию сначала делегируют поиск родительскому элементу, а затем пытаются загрузить класс самостоятельно.Возможно, вам нужна другая иерархия.Это причина, по которой OSGI и Eclipse имеют свои собственные загрузчики классов, поскольку файлы манифеста .MF определяют все типы странных путей иерархии (например, загрузка классов-приятелей).Все загрузчики классов Eclipse реализуют интерфейс BundleClassLoader и имеют дополнительный код для поиска ресурсов в плагинах Eclipse.

  3. Вам нужно внести некоторые изменения в байт-код.Возможно, байт-код зашифрован, и вы его на лету расшифроваете (Не то чтобы это действительно помогало, но пробовали).Возможно, вы хотите «исправить» классы, загружаемые на лету (улучшение байт-кода в стиле JDO).

Использование загрузчика классов, отличного от системного загрузчика классов, необходимо, если вам нужно выгрузить классы из памяти или загрузить классы, которые могут изменить свое определение во время выполнения.Типичным случаем является приложение, которое генерирует класс на лету, например, из XML-файла, а затем пытается перезагрузить этот класс.Как только класс окажется в системном загрузчике классов, его невозможно выгрузить и получить новое определение.

Другие советы

Обычно загрузчики классов используются для изоляции JAR.Если у вас есть приложение, которое использует плагины (Затмение, Мавен 2), то у вас может быть такая ситуация:Плагину X требуется jar A версии 1.0, а плагину Y нужен тот же jar, но версии 2.0.Однако X не работает с версией 2.0.

Если у вас есть загрузчики классов, вы можете создавать разделы классов (представьте себе изолированные острова, соединенные тонкими мостиками;мосты — это загрузчики классов).Таким образом, загрузчики классов могут контролировать то, что может видеть каждый плагин.

Когда плагин X создает экземпляр класса Foo, который имеет статические поля, это не проблема, и не будет путаницы с «тем же» классом в плагине Y, потому что каждый загрузчик классов фактически создаст свой собственный экземпляр класса Foo.Затем у вас есть два класса в памяти, где cl1.getName().equals(cl2.getName()) является true но cl1.equals(cl2) не является.Это означает, что экземпляры cl1 несовместимы по присваиванию с экземплярами cl2.Это может привести к странным ClassCastExceptions которые говорят, что org.project.Foo не может быть назначен на org.project.Foo.

Как и в случае с отдаленными островами, два класса не знают о существовании другого.Подумайте о человеческих клонах, которые рождаются, а затем растут на разных островах.С точки зрения виртуальной машины проблем нет, поскольку экземпляры типа Class обрабатываются как любой другой объект:Их может быть несколько.То, что вы думаете, что некоторые из них «одинаковые», не имеет значения для виртуальной машины.

Другое применение этого шаблона состоит в том, что вы можете избавиться от классов, загруженных таким образом:Просто убедитесь, что ни у кого нет указателя на какой-либо объект, созданный из классов, загруженных из загрузчика классов, а затем забудьте и о загрузчике классов.При следующем запуске ГК, все классы, загруженные этим загрузчиком классов, удаляются из памяти.Это позволяет вам «перезагрузить» ваше приложение без перезапуска всей виртуальной машины.

Несколько блогов, которые я написал в далеком прошлом об использовании загрузчиков классов после делегирования:

В таких случаях вы не можете пройти мимо исходного источника.Если вы Действительно хочу внутренний наркотик, твердое ядро, читать соответствующие части спецификации виртуальной машины Java.

Еще одна хорошая ссылка для загрузчиков классов Java - Загрузчики классов Java

Крайне редко вам понадобится создать свой собственный ClassLoader.И вообще, если вам нужно, вы уже должны хорошо понимать, что делает ClassLoader.

Другими словами, если вы спрашиваете, зачем вам нужно создавать свой собственный ClassLoader, то вам не нужно его создавать;)

При этом я также видел создание ClassLoader для приложения, занимающегося криптографией.Таким образом, каждый раз, когда вы создаете java.netSocket или какой-либо объект файла/потока, вместо использования версий JVM он будет использовать свои собственные специальные созданные классы.Таким образом, они могли гарантировать, что вся информация зашифрована и что не было ошибок разработчика.

Но это не очень распространено.Вы можете заняться Java-карьерой, даже не создавая собственный ClassLoader.На самом деле, если вам нужно его создать, вам действительно следует спросить, необходимо ли это.

Почему разработчики пишут собственные загрузчики классов, почему бы не вызвать загрузчик классов Bootstrap для вызова ваших собственных классов?Какая необходимость определять собственные загрузчики классов?

В зависимости от приложения разработчики могут переопределить или полностью заменить механизм загрузки классов в соответствии со своими потребностями.

Например, я использовал одно приложение, классы которого загружаются из LDAP: S

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

Что касается ресурсов, в сети есть ТОННЫ, которые просто невозможно перечислить.

Пример:

Tomcat использует настроенный загрузчик WebAppClassloader для загрузки и изоляции классов/JAR-файлов из разных веб-приложений.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top