Познакомиться с Java Reflection API и научиться использовать информацию о типах во время выполнения программы. Спроектировать генератор случайных значений и объектов, работающий не только с заранее известными классами.
Реализуйте генератор, которому можно передать Class<?> требуемого типа и получить значение этого типа. Примеры запросов:
Integer number = generateValueOfType(Integer.class);
String text = generateValueOfType(String.class);
Rectangle rectangle = generateValueOfType(Rectangle.class);
Shape shape = generateValueOfType(Shape.class);
int[] numbers = generateValueOfType(int[].class);
List<?> items = generateValueOfType(List.class);
Map<?, ?> entries = generateValueOfType(Map.class);Это примеры использования, а не обязательная сигнатура метода. Вы можете выбрать собственный API, но должна сохраняться возможность запросить значение по Class<?>.
Используйте java.lang.reflect для исследования пользовательских типов и создания их экземпляров. Для генерации случайных значений примитивных типов и строк используйте java.util.Random.
Классы в пакете classes задают ориентир по сложности объектов. Нельзя подменять универсальную генерацию набором специальных веток, рассчитанных исключительно на имена классов из шаблона. Генератор должен работать и с новыми классами сопоставимой сложности.
| Категория | Примеры |
|---|---|
| Примитивные типы и их обёртки | int, double, boolean, char, Integer, Double и др. |
| Строки | String |
| Перечисления | enum Color { RED, GREEN, BLUE } |
| Массивы | int[], String[], Color[], Rectangle[] |
| Списки | List (хотя бы один поддерживаемый вариант списка) |
| Отображения | Map (хотя бы один поддерживаемый вариант отображения) |
| Пользовательские классы | Rectangle, Triangle и новые классы аналогичной сложности |
| Интерфейсы и абстрактные классы | Shape и другие типы с подходящими реализациями |
Для массивов обязательна поддержка как минимум одномерных массивов с элементами поддерживаемых типов. Для List и Map достаточно продемонстрировать генерацию хотя бы одного непустого варианта каждого вида, содержащего сгенерированные элементы и пары ключ–значение соответственно. Поддержка всех разновидностей коллекций и произвольных сочетаний generic-типов не требуется. Выбранные ограничения опишите в своём решении.
Размеры массивов и коллекций, диапазоны и распределения случайных значений, длины строк и прочие параметры генерации определяются студентом. Генерация не должна сводиться к постоянному возвращению одной заглушки. Генерация void/Void не требуется.
Генератор должен создавать объекты пользовательских классов с применением Reflection API. Способ создания и заполнения объектов, а также выбор конструкторов остаются на усмотрение студента.
Помимо классов из шаблона, решение должно поддерживать новые подходящие классы без добавления отдельных проверок на их имена, а также классы из пакета classes, включая возможность запросить генерацию по Shape.class. В результате такого запроса должен получиться объект, совместимый с Shape. Аналогичное требование относится к поддерживаемым абстрактным классам.
Разработайте собственную аннотацию @Generatable и используйте её в работе генератора. Аннотация должна иметь реальное значение для логики программы, а не присутствовать только формально.
Правила её применения и интерпретации студент выбирает самостоятельно. В README своего решения необходимо объяснить выбранную семантику, в том числе для интерфейсов, абстрактных классов и их реализаций.
Если запрос невозможно обработать, генератор должен завершаться осмысленным исключением, по которому можно понять причину неудачи. Возврат null как универсальный признак ошибки не допускается.
Реализуйте генерацию значений с учётом предметных ограничений создаваемых объектов. Например, прямоугольник должен иметь допустимые размеры, а три стороны треугольника должны задавать существующий треугольник. Подход к решению выбирается самостоятельно; дополнительную функциональность необходимо продемонстрировать тестами.
Напишите автоматические JUnit-тесты. Проверяйте как классы из шаблона, так и собственные примеры. Тесты должны подтверждать работу обязательных категорий типов, включая List и Map, создание пользовательских объектов, генерацию по Shape.class, выбранную семантику @Generatable и поведение при неудачной генерации.
Тесты должны проверять свойства полученного результата, а не требовать конкретного случайного значения.
Локальный запуск:
./gradlew testВ Windows можно использовать gradlew.bat test.
Обязательно настройте GitHub Actions для автоматического запуска JUnit-тестов при push и pull_request. Workflow должен находиться в .github/workflows/. В Pull Request должны быть доступны результаты выполнения CI. Успешная сборка без содержательных автоматических тестов не заменяет требование о тестировании.
Студент вправе самостоятельно менять версии Java и Gradle по своему усмотрению. Версии, указанные в шаблоне, не обязательны. Допускается обновлять зависимости, в том числе JUnit. Главное — обеспечить совместимость выбранных версий, работоспособность проекта и запуск тестов как локально, так и в GitHub Actions.
Дедлайн: 04.11.2026 включительно.
- Создайте собственный репозиторий на основе шаблона и выполняйте работу в отдельной ветке.
- Откройте Pull Request между ветками своего репозитория (например,
solution→mainилиmaster). PR в исходный репозиторий преподавателя не нужен. - До дедлайна отправьте преподавателю ссылку на PR. К этому моменту в PR должна находиться содержательная реализация, а не заглушки, пустые коммиты или описание планов. Подобные формальные сдачи не засчитываются как выполненные в срок.
- В PR должны быть доступны исходный код, JUnit-тесты и конфигурация GitHub Actions с результатами запуска.
Оценка выставляется по результатам защиты, без жёсткой балльной сетки по отдельным функциям. Будьте готовы продемонстрировать работу программы, объяснить выбранную архитектуру, правила применения @Generatable, границы поддерживаемых типов, тесты и известные ограничения решения, а также ответить на вопросы о поведении генератора в нестандартных ситуациях.
Дополнительные возможности приветствуются, но не заменяют обязательную часть.