Отражение имени используется для описания кода, который может проверять другой код в той же системе (или в самой себе).
Например, скажем, у вас есть объект неизвестного типа в Java, и вы хотели бы вызвать метод doSomething, если он существует. Система статической типизации Java на самом деле не предназначена для поддержки этого, если объект не соответствует известному интерфейсу, но используя отражение, ваш код может посмотреть на объект и выяснить, есть ли у него метод с именем doSomething, а затем вызвать его, если вы хочу.
Итак, чтобы дать вам пример кода этого на Java (представьте, что рассматриваемый объект - foo):
Method method = foo.getClass().getMethod("doSomething", null);
method.invoke(foo, null);
Одним из наиболее распространенных вариантов использования в Java является использование с аннотациями. JUnit 4, например, будет использовать отражение, чтобы просматривать ваши классы для методов, помеченных аннотацией @Test, и затем будет вызывать их при запуске модульного теста.
Есть несколько хороших примеров для размышления, с которых вы можете начать, по адресу http://docs.oracle.com/javase/tutorial/reflect/index.html.
И, наконец, да, концепции очень похожи в других статически типизированных языках, которые поддерживают рефлексию (например, C #). В динамически типизированных языках описанный выше вариант использования менее необходим (так как компилятор разрешит вызов любого метода для любого объекта, если во время выполнения произойдет сбой, если он не существует), но во втором случае поиска методов, которые отмечены или работа определенным образом все еще распространена.
Обновление из комментария:
Способность проверять код в системе и видеть типы объектов является не отражением, а типографским самоанализом. Отражение - это возможность вносить изменения во время выполнения, используя самоанализ. Различие здесь необходимо, так как некоторые языки поддерживают самоанализ, но не поддерживают рефлексию. Одним из таких примеров является C ++