Рубрики
Без рубрики

Быстрый и гибкий способ сканирования пути к классу в Java

Обзор В этом руководстве мы поговорим о новом механизме сканирования путей к классам и о том, как это сделать… С тегами java, tutorial, classpath, scanner.

Обзор

В этом уроке мы поговорим о новом механизме сканирования путей к классам и о том, как его использовать: Class Hunter of Ядро горящей волны , библиотека Java, полезная для создания фреймворков . Этот механизм сканирования путей к классам предоставляет возможность поиска классов по путям или пути к классам среды выполнения по объединяемым и вложенным критериям с использованием лямбда-выражений для собственных элементов отражения Java, таких как класс, Поле, Метод, Конструктор, Модуль, Пакет, Аннотация.

Зависимости Maven

Во-первых, давайте добавим базовую библиотеку Burning wave в наш pom.xml :

Использование

Теперь мы собираемся найти все классы пакета и, в частности, все классы в пути к классам среды выполнения, которые имеют имя пакета, соответствующее регулярному выражению. Вот код:

Давайте разберем приведенный выше пример:

  • мы начали с извлечения Охотника за классами через ComponentContainer
  • мы определяем регулярное выражение, которое мы передаем объекту критериев класса, который будет введен в объект конфигурации поиска
  • наконец, мы вызываем метод findBy , который загружает в кэш все загружаемые классы путей к классам по умолчанию, указанных в файле burningwave.properties (в данном случае это пути к классам среды выполнения: см. параграф 5 для получения дополнительной информации), затем применяет фильтр критериев и затем возвращает объект SearchResult , который содержит классы, соответствующие критериям. Также можно явно указать пути для поиска ( папки, zip, jar, ear и war будут рекурсивно сканироваться ), поэтому приведенный выше пример также может быть записан следующим образом:

А теперь давайте рассмотрим более подробный пример, найдя все аннотированные классы конкретной библиотеки:

В приведенном выше примере в отличие от предыдущего примера:

  • мы предполагаем, что в пути к классу среды выполнения присутствует jar с именем “spring-core-4.3.4.RELEASE.jar ” который мы создали как уникальный ресурс подлежащий сканированию
  • мы создаем сложные критерии класса, с помощью которых мы запрашиваем все классы, которые имеют хотя бы одну аннотацию к объявлению класса или хотя бы одну аннотацию к объявлению любого из его членов (полей, методов или конструкторов). Обратите внимание на вызов метода ‘ byScanUpTo ‘: он получает лямбда-выражение в качестве входных данных, с помощью которого, в данном случае, мы просим механизм сканирования применить фильтр критериев для элемента ( ConstructorCriteria , Полевые критерии и Критерии метода ) только для итерированного класса, а не для всей его иерархии, потому что в противном случае по умолчанию фильтры, введенные в критерии членов, применяются ко всей иерархии

Основные характеристики и конфигурация компонентов

Поисковик классов – это компонент, который запрашивает классы, присутствующие в путях, полученных во входных данных, и возвращает только те классы, которые соответствуют выбранному критерию. Поиск, выполняемый им, выполняется в многопоточном контексте и рекурсивно по папкам и поддерживаемым сжатым файлам (zip, jar, jmod, war и ear) и даже во вложенных сжатых файлах и папках. Этот компонент может кэшировать классы, найденные в путях к классам, чтобы быстрее выполнять следующий поиск, и использует PathScannerClassLoader , который настраивается с помощью закодированного в Java свойства ” class-hunter.default-path-scanner-class-loaderburningwave.свойства файл. A Свойство, закодированное в Java , – это свойство, созданное из кода Java, которое будет разрешено после его компиляции во время выполнения. Значение по умолчанию свойства ‘class-hunter.default-path-scanner-class-loader’, как вы можете видеть в файле по умолчанию burningwave.properties , является следующим:

… Что означает, что загрузчик классов по умолчанию, используемый Охотником за классами, – это загрузчик классов, предоставляемый методом ‘ getPath Scanner ClassLoader ‘ из ComponentContainer . Родительский загрузчик классов этого загрузчика классов может быть указан с помощью закодированного в Java свойства ‘ path-scanner-classloader.parent

Компоненты конфигурации поиска

Основной объект конфигурации поиска представлен классом Search Config , которому должны быть (необязательно) переданы пути для сканирования и (также необязательно) критерии запроса, представленные ClassCriteria . Если в SearchConfig не будет передан путь, сканирование будет выполнено по путям, указанным свойством ‘ paths.hunters.default-search-config.paths ‘ файла burningwave.properties , который имеет следующее значение по умолчанию:

… И включает в себя следующие свойства:

… Это означает, что сканирование будет выполнено через:

  • путь к классу среды выполнения (который указывается системным свойством ‘java.class.path’)
  • прямые дочерние элементы папки ‘lib’ домашней виртуальной машины, которые имеют ‘jar’ в качестве расширения
  • прямые дочерние элементы папки ‘jmods’ домашней jvm (9 или более поздней версии), которые имеют ‘jmod’ в качестве расширения

Если в объект конфигурации поиска не будут переданы критерии класса, поиск будет выполнен без фильтра, и будут возвращены все загружаемые классы путей .

Вывод

В этой статье мы узнали, как эффективно фильтровать классы некоторых путей к классам по различным критериям. Полный исходный код всех примеров в этой статье доступен на GitHub вместе с другими примерами.

Оригинал: “https://dev.to/bw_software/how-to-scan-the-classpath-in-java-fk8”