Ответ 1
Статья в Википедии содержит довольно приличное резюме:
При вычислении тип introspection - это способность программы проверять тип или свойства объекта во время выполнения. Некоторые языки программирования обладают этой возможностью.
Интроспекция не следует путать с рефлексией, что делает шаг вперед и является возможностью для программы манипулировать значениями, метаданными, свойствами и/или функциями объекта во время выполнения. Некоторые языки программирования, например. Java, также обладают этой возможностью.
Возьмите статически типизированную, скомпилированную программу:
SomeType function foo(int i) {
return new SomeType(i);
}
Все типы известны и применяются во время компиляции, программа не должна даже компилироваться, если она не удовлетворяет своим собственным явным ограничениям типа. Динамические языки программирования обычно не демонстрируют такую жесткость, типы переменных не обязательно известны во время компиляции. Они могут выглядеть примерно так:
function foo(i) {
return new SomeType(i);
}
Функция не может гарантировать, что именно i
точно, она просто передает ее. Это может или не может вызвать проблемы где-то, система типов не может помочь здесь. Такая проверка ошибок обычно отводится на код пользователя, для которого такой код нуждается в возможности самоанализа:
function foo(i) {
if (!is_int(i)) {
throw new InvalidArgumentException;
}
return new SomeType(i);
}
Где именно, чтобы нарисовать линию между самоанализа и рефлексии несколько спорно. Можно сказать, что интроспекция - это все, что позволяет коду проверять, что-то ( "Что я?" ), Тогда как отражение - это способность управлять самой структурой программы. Например, пример PHP:
$ref = new ReflectionClass('Foo');
$foo = $ref->newInstanceWithoutConstructor();
Приведенный выше код обходит работу над конструктором класса Foo
при создании нового экземпляра. Это манипуляция кодом во время выполнения. На практике, однако, API отражения в PHP также содержит возможности самоанализа. Некоторые из этих возможностей являются дубликатом того, что можно сделать с помощью "более низких" возможностей интроспекции. Например:.
$ref = new ReflectionClass($obj);
if ($ref->getName() == 'Foo') ...
if ($obj instanceof Foo) ...
Оба фрагмента по существу делают одно и то же, но одно использует отражение, а другое - то, что будет называться интроспекцией. Как видите, едва ли есть четкая разделительная линия. Однако отражение, как правило, более мощное, чем интроспекция. Например, в PHP вы должны использовать API отражения для получения информации о типах аргументов, которые принимает функция. Это просто "пассивная" интроспекция, но относится к API отражения. В основном это вопрос практической реализации.
Короче говоря, по общему определению, чтобы быть интроспективным, программа должна иметь возможность исследовать части себя во время выполнения и выполнять другой код на основе этой информации. Отражающая программа помимо этого может изменять свои собственные правила выполнения кода во время выполнения, например, не ссылаться на конструктор, что в противном случае является обязательной операцией, определенной языком.