Почему некоторые программы loadClass вместо нового класса в Java

В одном из классов Spring org.springframework.web.servlet.view.tiles2.TilesConfigurer выполняется следующий код:

Class clazz = getClass().getClassLoader().loadClass(
 "org.apache.tiles.extras.complete.CompleteAutoloadTilesInitializer");
this.tilesInitializer = (TilesInitializer) clazz.newInstance();

Почему автор просто не написал

this.tilesInitializer = new org.apache.tiles.extras
 .complete.CompleteAutoloadTilesInitializer()

Есть ли разница в выходе или улучшении для этого в первую очередь?

Обновление. Код в классе TilesConfigurer точно так же, как в первом примере. Он не загружает строку из слоя DI. Это строковая кодированная строка.

2 ответа

Во втором случае зависимость существует в коде (во время компиляции), тогда как в первом случае зависимость создается только при запуске этого кода.

Ведение вещей первый способ может быть полезен по нескольким причинам:

  • Вы хотите ускорить загрузку программы (во втором случае classloader загрузит класс плиток Apache и его зависимости, когда этот spring класс загружен, в первом случае он будет ожидать этого, пока этот spring код не будет )

  • Вы хотите иметь код, который может стоять без этой зависимости (во втором случае вы не можете скомпилировать или загрузить код без Файлы styles.extras.... class присутствуют, но в первом случае вы можете, и они могут просто предоставить дополнительную функциональность, если они есть).


Было бы очень полезно, если бы вы включили объявление "tilesInitializer". Скорее всего, он объявлен как тип интерфейса.

Загрузка фактической реализации таким образом освобождает вас от зависимостей времени компиляции - на самом деле вам не нужно иметь реализацию CompleteAutoloadTilesInitializer в вашем пути к классам для компиляции. Он также позволяет поместить выбор фактического класса для загрузки в файл конфигурации.

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

Это позволяет реагировать на обработку случая, когда класс недоступен в блоке catch, который, безусловно, окружает вызов loadClass (путем выбора другой реализации или отключения функций, которые он предоставил). Это позволяет пользователям только развертывать банки, которые они действительно используют.

licensed under cc by-sa 3.0 with attribution.