Подтвердить что ты не робот

Погрузчики классов Java

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

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

    Спасибо заранее.

4b9b3361

Ответ 1

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

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

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

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

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

Ответ 2

Обычно использование загрузчиков классов заключается в изоляции JAR. Если у вас есть приложение, которое использует плагины (Eclipse, Maven 2), тогда у вас может быть такая ситуация: плагин X нуждается в jar A с версией 1.0, тогда как плагин Y нуждается в том же банке, но в версии 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 обрабатываются как любой другой объект: их может быть несколько. То, что вы считаете, что некоторые из них "одинаковы", не имеет значения для виртуальной машины.

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

Ответ 5

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

Ответ 6

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

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

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

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

Ответ 7

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

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

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

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

О ресурсах есть TONS, в Интернете, которые просто не могут быть перечислены.

Ответ 8

Пример:

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