Skip to content

Repository files navigation

Интроспекция и рефлексия

Проект разработан в качестве пятого домашнего задания в Т-Академии по теме «Принципы работы в команде».

Многомодульный Maven-проект для анализа структуры Java-классов и сравнения производительности различных способов вызова методов.

Проект включает:

  • консольную утилиту Class Inspector, которая формирует описание класса в текстовом или JSON-формате и создаёт экземпляры классов со случайно заполненными полями;
  • набор JMH-бенчмарков для сравнения прямого вызова метода, Reflection API, MethodHandle и LambdaMetafactory.

Содержание

Состав проекта

Модуль Назначение
hw5-class-inspector Инспекция Java-классов, форматирование результата и создание экземпляров
hw5-benchmark JMH-бенчмарки способов вызова метода Student#name()

Родительский модуль hw5 централизованно управляет версиями зависимостей, настройками компиляции, тестирования и статического анализа.

Технологический стек

Компонент Версия или назначение
Java 24
Maven 3.9.11 через Maven Wrapper
JMH 1.37, выполнение микробенчмарков
Picocli 4.7.7, обработка аргументов командной строки
Jackson 2.19.2, формирование JSON
JUnit Jupiter и AssertJ модульное тестирование
JaCoCo формирование отчёта о покрытии
Spotless, Modernizer, SpotBugs, PMD, CPD контроль качества кода

Требования

Для локальной работы необходимы:

  • JDK 24 или новее;
  • Git;
  • доступ к Maven Central при первом запуске.

Устанавливать Maven отдельно не требуется: в репозитории находится Maven Wrapper, который использует Maven 3.9.11.

Проверить окружение:

java -version
bash ./mvnw -version

Для PowerShell используйте .\mvnw.cmd вместо bash ./mvnw.

Сборка и проверка

Полная чистая сборка всех модулей:

bash ./mvnw clean verify

Команда компилирует проект, запускает тесты и формирует JAR-файлы:

hw5-benchmark/target/hw5-benchmark-1.0.jar
hw5-class-inspector/target/hw5-class-inspector-1.0.jar

Запуск только тестов:

bash ./mvnw test

Запуск набора проверок качества, используемого в CI:

bash ./mvnw clean compile -am \
  spotless:check \
  modernizer:modernizer \
  spotbugs:check \
  pmd:check \
  pmd:cpd-check

В PowerShell ту же команду можно выполнить одной строкой:

.\mvnw.cmd clean compile -am spotless:check modernizer:modernizer spotbugs:check pmd:check pmd:cpd-check

Class Inspector

Модуль hw5-class-inspector предоставляет публичный фасад academy.Inspector и консольное приложение academy.Application.

Возможности

Метод Inspector.inspect(Class<?>, String) собирает следующие сведения:

  • простое имя класса и его суперкласс;
  • реализованные интерфейсы;
  • объявленные поля, их типы и модификаторы доступа;
  • объявленные методы, параметры, возвращаемые типы и модификаторы доступа;
  • аннотации класса;
  • иерархию наследования, включая разрешённых потомков sealed-классов.

Результат доступен в форматах TEXT и JSON.

Метод Inspector.create(Class<T>) создаёт экземпляр класса и заполняет нестатические и нефинальные поля случайными значениями. Поддерживаются примитивы и их обёртки, строки, java.util.Date, массивы, списки и вложенные объекты. Глубина рекурсивного создания ограничена пятью уровнями.

Параметры командной строки

Параметр Обязательный Значение
-c, --class да Полное имя анализируемого класса
-f, --format нет Формат TEXT или JSON; по умолчанию TEXT
-h, --help нет Справка по использованию
-V, --version нет Версия приложения

Формат чувствителен к регистру. После вывода результатов инспекции консольное приложение также пытается создать и вывести экземпляр указанного класса.

Запуск

Сначала соберите модуль и необходимые зависимости:

bash ./mvnw -pl hw5-class-inspector -am compile

Запуск через Maven Exec Plugin:

bash ./mvnw -pl hw5-class-inspector exec:java \
  -Dexec.mainClass=academy.Application \
  -Dexec.args="--class academy.sample.Person --format TEXT"

Пример для PowerShell:

.\mvnw.cmd -pl hw5-class-inspector exec:java "-Dexec.mainClass=academy.Application" "-Dexec.args=--class academy.sample.Person --format JSON"

Коды завершения

Код Описание
0 Команда выполнена успешно
1 Непредвиденная ошибка во время инспекции или создания экземпляра
2 Некорректные параметры, неподдерживаемый формат или класс не найден

Программный интерфейс

String report = Inspector.inspect(academy.sample.Person.class, "JSON");
academy.sample.Person person = Inspector.create(academy.sample.Person.class);

Бенчмарки

Модуль hw5-benchmark измеряет среднее время вызова метода Student#name() четырьмя способами:

Бенчмарк Способ вызова
benchmarkDirectCall прямой вызов
benchmarkReflectionMethod java.lang.reflect.Method#invoke
benchmarkMethodHandle MethodHandle#invoke
benchmarkLambdaMetafactory лямбда, созданная через LambdaMetafactory

Все вспомогательные объекты создаются в методе @Setup, а результаты передаются в JMH Blackhole, чтобы исключить удаление вычислений JIT-компилятором.

Параметры измерения

Параметр Значение
Режим AverageTime
Единица измерения наносекунды на операцию
Прогрев 5 итераций по 1 секунде
Измерение 5 итераций по 1 секунде
Fork 1

Запуск

Bash:

./mvnw -pl hw5-benchmark -am compile dependency:copy-dependencies \
  -DoutputDirectory=target/dependency
java -cp "hw5-benchmark/target/classes:hw5-benchmark/target/dependency/*" academy.Application

PowerShell:

.\mvnw.cmd -pl hw5-benchmark -am compile dependency:copy-dependencies "-DoutputDirectory=target/dependency"
java -cp "hw5-benchmark\target\classes;hw5-benchmark\target\dependency\*" academy.Application

JMH выводит итоговую таблицу в стандартный поток вывода. Для сопоставимых результатов запускайте измерения при минимальной фоновой нагрузке и не сравнивайте результаты, полученные на разных аппаратных и программных конфигурациях.

Структура репозитория

.
├── .github/workflows/ci.yml
├── .mvn/
├── hw5-benchmark/
│   ├── pom.xml
│   └── src/main/java/academy/
├── hw5-class-inspector/
│   ├── pom.xml
│   └── src/
│       ├── main/java/academy/
│       └── test/java/academy/
├── pmd.xml
├── spotbugs-excludes.xml
├── pom.xml
├── mvnw
└── mvnw.cmd

Непрерывная интеграция

GitHub Actions workflow .github/workflows/ci.yml запускается:

  • для каждого pull request;
  • при push в ветку master.

Pipeline использует Eclipse Temurin JDK 24 и Maven Wrapper 3.9.11. Сначала выполняется полная проверка проекта командой verify, затем запускаются Spotless, Modernizer, SpotBugs, PMD и CPD.

Ограничения реализации

  • Инспектор анализирует только поля и методы, объявленные непосредственно в переданном классе.
  • Поиск потомков ограничен классами, доступными через механизм sealed/permits.
  • Генератор экземпляров использует конструктор без параметров либо первый публичный конструктор. Классы без подходящего конструктора создать нельзя.
  • Списки создаются пустыми; статические и финальные поля не изменяются.
  • Созданные Maven-сборкой JAR-файлы не содержат зависимости. Для запуска приложений используйте Maven Exec Plugin либо сформируйте внешний classpath.

About

No description, website, or topics provided.

Resources

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages