Проект разработан в качестве пятого домашнего задания в Т-Академии по теме «Принципы работы в команде».
Многомодульный Maven-проект для анализа структуры Java-классов и сравнения производительности различных способов вызова методов.
Проект включает:
- консольную утилиту
Class Inspector, которая формирует описание класса в текстовом или JSON-формате и создаёт экземпляры классов со случайно заполненными полями; - набор JMH-бенчмарков для сравнения прямого вызова метода, Reflection API,
MethodHandleиLambdaMetafactory.
- Состав проекта
- Технологический стек
- Требования
- Сборка и проверка
- Class Inspector
- Бенчмарки
- Структура репозитория
- Непрерывная интеграция
- Ограничения реализации
| Модуль | Назначение |
|---|---|
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Модуль 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.ApplicationPowerShell:
.\mvnw.cmd -pl hw5-benchmark -am compile dependency:copy-dependencies "-DoutputDirectory=target/dependency"
java -cp "hw5-benchmark\target\classes;hw5-benchmark\target\dependency\*" academy.ApplicationJMH выводит итоговую таблицу в стандартный поток вывода. Для сопоставимых результатов запускайте измерения при минимальной фоновой нагрузке и не сравнивайте результаты, полученные на разных аппаратных и программных конфигурациях.
.
├── .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.