Когда создавать собственные загрузчики классов?
Зачем вам когда-либо нужно создавать собственные загрузчики классов? Пример из реального мира был бы великолепен!
4 ответа
Серверы приложений, такие как серверы Java EE и контейнеры OSGI, используют настраиваемый загрузчик классов для динамического обновления и удаления программного обеспечения.
Другие пользовательские загрузчики классов используются для поддержки динамических внедрений кода (Из Java 5.0 Instrumentation предпочтительнее)
Типичные случаи:
Инструменты / Загрузка классов во время выполнения.
Загрузка зашифрованных классов.
Удаленная загрузка классов.
Это не то, что вам, вероятно, когда-либо придется писать самостоятельно, но вы можете использовать его как часть некоторых сложных сред - например, внедрение зависимостей часто реализуется с помощью ClassLoaders. Другое распространенное использование пользовательских загрузчиков классов - это модульное тестирование: пользовательский загрузчик классов может использоваться для замены классов, загружаемых тестируемым модулем, на "фиктивные" версии, которые реагируют контролируемым образом (например, для имитации ошибок, которые в противном случае были бы сложно создать).
Честно говоря, действительно сложно представить себе экосистему Java без нестандартных загрузчиков классов. Многие слабосвязанные архитектуры основаны на загрузчиках классов. Я бы предложил провести несколько часов с JSPF (Java Simple Plugin Framework), потому что только некоторый практический опыт будет действительно ценным для вас. JSPF довольно прост и позволяет не только понять потенциальные случаи, когда требуются пользовательские загрузчики классов, но и почувствовать всю мощь такого решения.
Попробуйте следовать простому плану:
- Определить интерфейс (контракт)
- Обеспечить реализацию как независимый модуль /jar
- Используйте JSPF и ранее определенный контракт для обнаружения доступных реализаций.
- Сделайте некоторые полезные вещи с обнаруженной реализацией
- Поймите, у вас слабосвязанная система
- Узнайте, как на самом деле используются загрузчики классов в этом примере
Пожалуйста, просмотрите также следующие ссылки: