Skip to content

Latest commit

 

History

History
99 lines (61 loc) · 11 KB

File metadata and controls

99 lines (61 loc) · 11 KB

Лабораторная работа № 2. Java Reflection — генератор объектов

Цель

Познакомиться с 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

Разработайте собственную аннотацию @Generatable и используйте её в работе генератора. Аннотация должна иметь реальное значение для логики программы, а не присутствовать только формально.

Правила её применения и интерпретации студент выбирает самостоятельно. В README своего решения необходимо объяснить выбранную семантику, в том числе для интерфейсов, абстрактных классов и их реализаций.

Ошибки генерации

Если запрос невозможно обработать, генератор должен завершаться осмысленным исключением, по которому можно понять причину неудачи. Возврат null как универсальный признак ошибки не допускается.

Дополнительное задание (необязательно)

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

Тесты и CI

Напишите автоматические 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

Студент вправе самостоятельно менять версии Java и Gradle по своему усмотрению. Версии, указанные в шаблоне, не обязательны. Допускается обновлять зависимости, в том числе JUnit. Главное — обеспечить совместимость выбранных версий, работоспособность проекта и запуск тестов как локально, так и в GitHub Actions.

Сдача и дедлайн

Дедлайн: 04.11.2026 включительно.

  1. Создайте собственный репозиторий на основе шаблона и выполняйте работу в отдельной ветке.
  2. Откройте Pull Request между ветками своего репозитория (например, solution → main или master). PR в исходный репозиторий преподавателя не нужен.
  3. До дедлайна отправьте преподавателю ссылку на PR. К этому моменту в PR должна находиться содержательная реализация, а не заглушки, пустые коммиты или описание планов. Подобные формальные сдачи не засчитываются как выполненные в срок.
  4. В PR должны быть доступны исходный код, JUnit-тесты и конфигурация GitHub Actions с результатами запуска.

Защита

Оценка выставляется по результатам защиты, без жёсткой балльной сетки по отдельным функциям. Будьте готовы продемонстрировать работу программы, объяснить выбранную архитектуру, правила применения @Generatable, границы поддерживаемых типов, тесты и известные ограничения решения, а также ответить на вопросы о поведении генератора в нестандартных ситуациях.

Дополнительные возможности приветствуются, но не заменяют обязательную часть.