Отражение имени используется для описания кода, который может проверять другой код в той же системе (или в самой себе).
Например, скажем, у вас есть объект неизвестного типа в 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 ++