Конечно, есть хорошие варианты использования. Например, получение предоставленных разработчиком метаданных. Java API все чаще используют аннотации для предоставления информации о методах / полях / классах и их использовании. Как проверка входных данных, привязка к представлениям данных ... Вы можете использовать их во время компиляции, чтобы генерировать дескрипторы метаданных и использовать их, но чтобы сделать это во время выполнения, потребуется отражение. Даже если бы вы использовали дескрипторы метаданных, они в конечном итоге содержали бы такие вещи, как имена классов, методов и полей, к которым нужно было бы обращаться с помощью отражения.
Другой вариант использования: динамические языки. Взять Ruby ... Это позволяет вам заранее проверить, будет ли объект отвечать на имя метода, прежде чем пытаться вызвать этот метод. Нечто подобное требует отражения.
Или как насчет того, когда имя класса или метода должно быть предоставлено извне скомпилированного кода, как при выборе реализации некоторого API. Это будет просто текст. Поиск того, к чему он приводит, сводится к размышлению.