Основные принципы программирования: интроспекция и рефлексия
Часто во время работы программы нам бывает нужна информация о данных — например, какой у них тип или являются ли они экземпляром класса (в ООП). Опираясь на эти знания, нам нужно проводить над данными некоторые операции, или даже изменять их — но необходимого вида данных у нас может и не быть! Если вы ничего не поняли, не расстраивайтесь — мы подробно во всём разберёмся. Всё, что я здесь описал — это иллюстрация целей двух возможностей, присутствующих почти в каждом современном языке программирования: интроспекции и рефлексии.
Интроспекция
Интроспекция — это способность программы исследовать тип или свойства объекта во время работы программы. Как мы уже упоминали, вы можете поинтересоваться, каков тип объекта, является ли он экземпляром класса. Некоторые языки даже позволяют узнать иерархию наследования объекта. Возможность интроспекции есть в таких языках, как Ruby, Java, PHP, Python, C++ и других. В целом, инстроспекция — это очень простое и очень мощное явление. Вот несколько примеров использования инстроспекции:
// Java if(obj instanceof Person)
//PHP if ($obj instanceof Person) < // делаем что угодно >
В Python самой распространённой формой интроспекции является использование метода dir для вывода списка атрибутов объекта:
# Python class foo(object): def __init__(self, val): self.x = val def bar(self): return self.x . dir(foo(5)) => ['__class__', '__delattr__', '__dict__', '__doc__', '__getattribute__', '__hash__', '__init__', '__module__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__str__', '__weakref__', 'bar', 'x']
В Ruby интроспекция очень полезна — в частности из-за того, как устроен сам язык. В нём всё является объектами — даже класс — и это приводит к интересным возможностям в плане наследования и рефлексии (об этом ниже). Если вы хотите узнать об этом больше, советую прочитать мини-цикл Metaprogramming in Ruby.
Прим. перев. Также не будет лишним прочитать нашу статью, посвящённую интроспекции в Ruby.
Вот несколько простых примеров интроспекции с использованием IRB (Interactive Ruby Shell):
# Ruby $ irb irb(main):001:0> A=Class.new => A irb(main):002:0> B=Class.new A => B irb(main):003:0> a=A.new => # irb(main):004:0> b=B.new => # irb(main):005:0> a.instance_of? A => true irb(main):006:0> b.instance_of? A => false irb(main):007:0> b.kind_of? A => true
Вы также можете узнать у объекта, экземпляром какого класса он является, и даже “сравнить” классы.
# Ruby irb(main):008:0> A.instance_of? Class => true irb(main):009:0> a.class => A irb(main):010:0> a.class.class => Class irb(main):011:0> A > B => true irb(main):012:0> B true
Однако интроспекция — это не рефлексия; рефлексия позволяет нам использовать ключевые принципы интроспекции и делать действительно мощные вещи с нашим кодом.
Рефлексия
Интроспекция позволяет вам изучать атрибуты объекта во время выполнения программы, а рефлексия — манипулировать ими. Рефлексия — это способность компьютерной программы изучать и модифицировать свою структуру и поведение (значения, мета-данные, свойства и функции) во время выполнения. Простым языком: она позволяет вам вызывать методы объектов, создавать новые объекты, модифицировать их, даже не зная имён интерфейсов, полей, методов во время компиляции. Из-за такой природы рефлексии её труднее реализовать в статически типизированных языках, поскольку ошибки типизации возникают во время компиляции, а не исполнения программы (подробнее об этом здесь). Тем не менее, она возможна, ведь такие языки, как Java, C# и другие допускают использование как интроспекции, так и рефлексии (но не C++, он позволяет использовать лишь интроспекцию).
По той же причине рефлексию проще реализовать в интерпретируемых языках, поскольку когда функции, объекты и другие структуры данных создаются и вызываются во время работы программы, используется какая-то система распределения памяти. Интерпретируемые языки обычно предоставляют такую систему по умолчанию, а для компилируемых понадобится дополнительный компилятор и интерпретатор, который следит за корректностью рефлексии.
Мне кажется, что мы сказали много об определении рефлексии, но смысла это пока несёт мало. Давайте взглянем на примеры кода ниже (с рефлексией и без), каждый из которых создаёт объект класса Foo и вызывает метод hello.
// ECMAScript - как JavaScript // Без рефлексии new Foo().hello() // С рефлексией // предполагаем, что Foo принадлежит this new this['Foo']()['hello']() // или не предполагаем new (eval('Foo'))()['hello']() // или вообще не заморачиваемся eval('new Foo().hello()')
// Java // Без рефлексии Foo foo = new Foo(); foo.hello(); // С рефлексией Object foo = Class.forName("complete.classpath.and.Foo").newInstance(); // Альтернатива: Object foo = Foo.class.newInstance(); Method m = foo.getClass().getDeclaredMethod("hello", new Class[0]); m.invoke(foo);
# Python # Без рефлексии obj = Foo() obj.hello() # С рефлексией class_name = "Foo" method = "hello" obj = globals()[class_name]() getattr(obj, method)() # С eval eval("Foo().hello()")
# Ruby # Без рефлексии obj = Foo.new obj.hello # С рефлексией class_name = "Foo" method = :hello obj = Kernel.const_get(class_name).new obj.send method # С eval eval "Foo.new.hello"
Этот список отнюдь не исчерпывает возможности рефлексии. Это очень мощный принцип, который к тому же является обычной практикой в метапрограммировании. Тем не менее, при использовании рефлексии нужно быть очень внимательным. Хотя у неё и есть свои преимущества, код, использующий рефлексию, значительно менее читаем, он затрудняет отладку, а также открывает двери по-настоящему плохим вещами, например, инъекции кода через выражения eval.
Eval-выражения
Некоторые рефлективные языки предоставляют возможность использования eval-выражений — выражений, которые распознают значение (обычно строку) как выражение. Такие утверждения — это самый мощный принцип рефлексии и даже метапрограммирования, но также и самый опасный, поскольку они представляют собой угрозу безопасности.
Рассмотрим следующий пример кода на Python, который принимает данные из стороннего источника в Сети (это одна из причин, по которой люди пользуются eval-выражениями):
session['authenticated'] = False data = get_data() foo = eval(data)
Защита программы будет нарушена, если кто-то передаст в метод get_data() такую строку:
"session.update(authenticated=True)"
Для безопасного использования eval-утверждений нужно сильно ограничивать формат входных данных — и обычно это лишь занимает лишнее время.
Заключение
Интроспекция и рефлексия — это очень мощные инструменты современных языков, и их понимание может позволить вам писать по-настоящему крутой код. Ещё раз отметим: интроспекция — это изучение атрибутов объекта, а рефлексия — это манипуляция ими. Будьте внимательны при использовании рефлексии, поскольку она может сделать ваш код нечитаемым и уязвимым. Чем больше сила, тем больше и ответственность — вот девиз всего, что связано с метапрограммированием.
Рефлексия (программирование)
В информатике отражение или рефлексия (холоним интроспекции, англ. reflection) означает процесс, во время которого программа может отслеживать и модифицировать собственную структуру и поведение во время выполнения. Парадигма программирования, положенная в основу отражения, называется рефлексивным программированием. Это один из видов метапрограммирования.
Во время выполнения программных инструкций (кода) компьютеры обрабатывают данные, что приводит к их изменению, при этом компьютеры не изменяют код. Однако, в большинстве современных компьютерных архитектур код хранится как данные, и в некоторых языках программирования реализована возможность обрабатывать собственный код как данные, что приводит к изменению уже самого кода во время его выполнения. Такие самоизменяющиеся программы в основном создаются с помощью высокоуровневых языков программирования, использующих виртуальные машины (например, Smalltalk, скриптовые языки). В меньшей степени рефлексия используется в языках с объявляемыми и/или статическими типами (например, Си, ML, Haskell, F#).
Связанные понятия
Грамотное программирование (ГП; англ. Literate Programming) — концепция, методология программирования и документирования, в которой программа состоит из прозы на естественном языке вперемежку с макроподстановками и кодом на языках программирования. Термин и саму концепцию предложил Дональд Кнут в 1981 году при разработке системы компьютерной вёрстки TeX.
Язык программи́рования — формальный язык, предназначенный для записи компьютерных программ. Язык программирования определяет набор лексических, синтаксических и семантических правил, определяющих внешний вид программы и действия, которые выполнит исполнитель (обычно — ЭВМ) под её управлением.
Аспектно-ориентированная разработка программного обеспечения — развивающаяся технология разработки программного обеспечения, которая ищет новые способы разбиения на модули программного обеспечения, чтобы изолировать вторичные или вспомогательные функции от бизнес-логики основной программы. АОРПО позволяет реализовать отдельно различные проблемы и автоматически объединять их в работоспособные системы.
Интерпретируемый язык программирования — язык программирования, исходный код на котором выполняется методом интерпретации. Классифицируя языки программирования по способу исполнения, к группе интерпретируемых относят языки, в которых операторы программы друг за другом отдельно транслируются и сразу выполняются (интерпретируются) с помощью специальной программы-интерпретатора (что противопоставляется компилируемым языкам, в которых все операторы программы заранее оттранслированы в объектный код.
Метапрограммирование — вид программирования, связанный с созданием программ, которые порождают другие программы как результат своей работы (в частности, на стадии компиляции их исходного кода), либо программ, которые меняют себя во время выполнения (самомодифицирующийся код). Первое позволяет получать программы при меньших затратах времени и усилий на кодирование, чем если бы программист писал их вручную целиком, второе позволяет улучшить свойства кода (размер и быстродействие).
Упоминания в литературе
Функциональная сторона мышления характеризуется выработкой и принятием решения относительно способов профессионального воздействия (проявляется в поиске, «взвешивании», селекции содержания средств воздействия). И всё же в этом перечне можно выделить две основные функции: диагностическую и преобразовательную. Обе эти функции осуществляются в контексте конкретных ситуаций, из системы которых состоит профессиональная деятельность. Функции профессионального мышления субъекта в контексте практической деятельности выступают прежде всего как функции анализа конкретных производственных ситуаций, постановки задач в данных условиях деятельности, разработки планов и проектов решения этих задач, регуляции осуществления наличных планов, рефлексии полученных результатов. По своему происхождению профессиональное мышление представляет собой систему умственных действий, возникающих на основе познания и преобразования сложной ситуации. Такие действия, изменяясь по форме, сохраняют свою содержательную специфику, существенные свойства и функции профессионального мышления субъекта.
Первый и второй этапы представляют собой чувственный, эмпирический уровень познания языка, тогда как третий и четвертый – реализуются при условии наличия сознательного контроля над его освоением. По мнению А. Н. Корнева (2003), представленную модель необходимо дополнить следующим этапом, когда речевая деятельность становится объектом осознания. Автор говорит о том, что в этом случае предметом осознания являются не операции порождения высказывания, а сами высказывания с точки зрения их языковой организации. Данный этап требует наличия способности к рефлексии, высокой степени произвольности в оперировании языковым материалом, наличия способности к образованию понятий.
Необходимо отметить, что с точки зрения учебных планов характер и контекст технологии, которую нужно использовать, определяются в зависимости от цели обучения: конкретное знание и совокупность умений; компетентность в области инструментальных методов и средств; развитие интенциального обучения; формирование навыков творческого мышления, рефлексии, открытой познавательной установки.
Во-вторых, уже в монографии 1954 г. было введено очень важное различие психолингвистических и психологических единиц. Если первые из них суть оперативные единицы порождения (производства) и восприятия речи, своего рода функциональные блоки, действующие в процессах такого порождения и восприятия, то вторые (психологические единицы) – это компоненты нашего знания о своем языке. Это знание может привноситься в процессе обучения, например обучения грамоте или родному языку в школе; но в то же время определенное отношение к языку, простейшие формы его осознания, вообще рефлексии над ним, возникают помимо обучения и наряду с ним, в частности в дошкольном возрасте до начала всякого систематического обучения (см. об этом Главу 8).
Стремление к стимулированию рефлексивной активности субъектов управления связано с целесообразностью «рефлексивного выхода» за пределы сложившихся стереотипов принятия решений в проблемных ситуациях. С. Л. Рубинштейн[52] выделил два способа существования человека как субъекта жизни. Первый – жизнь, не выходящая за пределы непосредственных связей, в которых живет человек (реактивный способ жизнедеятельности). Второй способ существования связан с появлением рефлексии. Сознание выступает как разрыв, как выход из полной поглощенности непосредственным процессом жизни для выработки соответствующего отношения к ней, занятия позиции над ней, вне ее для суждения о ней (рефлексивный способ жизнедеятельности). Проблема надситуативной активности нашла свое отражение в многочисленных исследованиях психологов (В. А. Петровский, Я. А. Пономарев, Д. Б. Богоявленская, А. Г. Асмолов, И. Н. Семенов и др.) и она органично связана с стимулированием рефлексивной активности и повышением ее сложности.
IV этап: реализация проекта – практическая реализация образовательной программы, одновременно проводится текущая педагогическая диагностика, анализ и рефлексия процесса реализации программы, при затруднениях проводится текущая психологическая диагностика для определения причин и направления разрешения затруднений.
Согласно нашему предмету изучения, в учебном пособии в дальнейшем рассматриваются аспекты коммуникации применительно ко второму определению, если не сделано специального пояснения. Каждая наука или научное направление, изучающие те или иные аспекты коммуникации или соприкасающиеся с коммуникационными проблемами, выделяют из коммуникации свой предмет исследования. Теория коммуникации складывалась как междисциплинарное направление. “Ее возникновение было связано с необходимостью рефлексии по поводу собственной деятельности представителями средств массовой коммуникации в условиях “информационного взрыва”, что обусловило преобладание в этой сфере знания журналистов и лингвистов, а также выбор в качестве теоретического основания общенаучных принципов информационного подхода”2.
В-третьих, проектирование есть специфический индивидуально-творческий процесс, и в то же время данный процесс является коллективным. За счет обретения навыков работы в режиме группового творчества интенсивно развиваются проективные способности, предполагающие способность к рефлексии, целеобразованию, выбору адекватных решений, выстраиванию целого из частей.
– «контроллинг» как функция рефлексии согласования решений внутри каждой и между всеми управленческими функциями [130], вписывающихся и воздействующих на непрерывность управления. Контроллинг представляет собой составную часть процесса (надстройку) управления, преобразующую «жизненный» цикл управленческой деятельности в «выход». Эта надстройка является своеобразным «устройством» саморегулирования в экономическом субъекте, что обеспечивает обратную связь в контуре управления;
Связанные понятия (продолжение)
Концептуальное программирование — подход к программированию, описанный Э.Х. Тыугу в одноименной книге . К. программирование предполагает оперирование понятиями (концептами), описанными в терминах предметной области, что позволяет использовать ЭВМ на этапе постановки задачи. Достаточно точное описание задачи позволяет ЭВМ автоматически составлять программы для её решения. Характерными особенностями концептуального программирования являются также использование языка предметной области и использование.
Обобщённое программирование (англ. generic programming) — парадигма программирования, заключающаяся в таком описании данных и алгоритмов, которое можно применять к различным типам данных, не меняя само это описание. В том или ином виде поддерживается разными языками программирования. Возможности обобщённого программирования впервые появились в виде дженериков (обобщённых функций) в 1970-х годах в языках Клу и Ада, затем в виде параметрического полиморфизма в ML и его потомках, а затем во многих объектно-ориентированных.
Компью́терная програ́мма — 1) комбинация компьютерных инструкций и данных, позволяющая аппаратному обеспечению вычислительной системы выполнять вычисления или функции управления (стандарт ISO/IEC/IEEE 24765:2010); 2) синтаксическая единица, которая соответствует правилам определённого языка программирования, состоящая из определений и операторов или инструкций, необходимых для определённой функции, задачи или решения проблемы (стандарт ISO/IEC 2382-1:1993).
Языково-ориентированное программирование (ЯОП) (англ. Language Oriented Programming), также Расходящаяся разработка (англ. middle out development), также метаязыковая абстракция, также Разработка, опирающаяся на предметно-специфичный язык (англ. DSL-Based Development) — парадигма программирования, заключающаяся в разбиении процесса разработки программного обеспечения на стадии разработки предметно-ориентированных языков (DSL) и описания собственно решения задачи с их использованием. Стадии могут.
Многопроходный компилятор (англ. Multi-pass compiler) — тип компилятора, который обрабатывает исходный код или абстрактное синтаксическое дерево программы несколько раз (в отличие от однопроходного компилятора, который проходит программу только один раз). Между проходами генерируется промежуточный код, который принимается следующим проходом в качестве входа. Таким образом, многопроходный компилятор обрабатывает код по частям, проход за проходом, а последний проход выдает финальный результат программы.
Объе́ктно-ориенти́рованное программи́рование (ООП) — методология программирования, основанная на представлении программы в виде совокупности объектов, каждый из которых является экземпляром определённого класса, а классы образуют иерархию наследования.
Металингвистическая абстракция в информатике — это процесс решения сложных проблем путём создания нового языка или словарного запаса, чтобы лучше понять проблему пространства. Этот вопрос подробно описан в учебнике МТИ «Структура и интерпретация компьютерных программ», который рекомендует использовать язык Scheme как основу для создания новых языков.
Мультиме́тод (англ. multimethod) или мно́жественная диспетчериза́ция (англ. multiple dispatch) — механизм, позволяющий выбрать одну из нескольких функций в зависимости от динамических типов или значений аргументов. Представляет собой расширение одиночной диспетчеризации (виртуальных функций), где выбор метода осуществляется динамически на основе фактического типа объекта, для которого этот метод был вызван. Множественная диспетчеризация обобщает динамическую диспетчеризацию для случаев с двумя или.
Структу́рное программи́рование — парадигма программирования, в основе которой лежит представление программы в виде иерархической структуры блоков.
Клу (англ. Clu, CLU) — объектно-ориентированный язык программирования, одним из первых реализовавший концепцию абстрактных типов данных и парадигму обобщённого программирования. Создан группой учёных Массачусетского технологического института под руководством Барбары Лисков в 1974 году, широкого применения в практике не нашёл, однако многие его элементы использованы при создании таких языков, как Ада, C++, Java, Sather, Python, C#.
Функциона́льное программи́рование — раздел дискретной математики и парадигма программирования, в которой процесс вычисления трактуется как вычисление значений функций в математическом понимании последних (в отличие от функций как подпрограмм в процедурном программировании).
Динамический язык — язык программирования, который позволяет определять типы данных и осуществлять синтаксический анализ и компиляцию «на лету», на этапе выполнения программы. Динамические языки удобны для быстрой разработки приложений.
Стандартная библиотека языка программирования — набор модулей, классов, объектов, констант, глобальных переменных, шаблонов, макросов, функций и процедур, доступных для вызова из любой программы, написанной на этом языке и присутствующих во всех реализациях языка.
Аппликативное программирование — один из видов декларативного программирования, в котором написание программы состоит в систематическом осуществлении применения одного объекта к другому. Результатом такого применения вновь является объект, который может участвовать в применениях как в роли функции, так и в роли аргумента и так далее. Это делает запись программы математически ясной. Тот факт, что функция обозначается выражением, свидетельствует о возможности использования значений-функций — функциональных.
Рефа́кторинг (англ. refactoring), или перепроектирование кода, переработка кода, равносильное преобразование алгоритмов — процесс изменения внутренней структуры программы, не затрагивающий её внешнего поведения и имеющий целью облегчить понимание её работы. В основе рефакторинга лежит последовательность небольших эквивалентных (то есть сохраняющих поведение) преобразований. Поскольку каждое преобразование маленькое, программисту легче проследить за его правильностью, и в то же время вся последовательность.
В информатике типобезопасность (англ. type safety) языка программирования означает безопасность (или надёжность) его системы типов.
Чистота́ (в отношении языка программирования) — отсутствие побочных эффектов. Язык программирования является чистым в том случае, если все функции в программах этого языка являются чистыми.
Компонентно-ориентированное программирование (англ. component-oriented programming, COP) — парадигма программирования, существенным образом опирающаяся на понятие компонента — независимого модуля исходного кода программы, предназначенного для повторного использования и развёртывания и реализующегося в виде множества языковых конструкций (например, «классов» в объектно-ориентированных языках программирования), объединённых по общему признаку и организованных в соответствии с определёнными правилами.
Лисп (LISP, от англ. LISt Processing language — «язык обработки списков»; современное написание: Lisp) — семейство языков программирования, программы и данные в которых представляются системами линейных списков символов. Лисп был создан Джоном Маккарти для работ по искусственному интеллекту и до сих пор остаётся одним из основных инструментальных средств в данной области. Применяется он и как средство обычного промышленного программирования, от встроенных скриптов до веб-приложений массового использования.
Шаблон проектирования или паттерн (англ. design pattern) в разработке программного обеспечения — повторяемая архитектурная конструкция, представляющая собой решение проблемы проектирования в рамках некоторого часто возникающего контекста.
Предметно-ориентированный язык (англ. domain-specific language, DSL — «язык, специфический для предметной области») — язык программирования, специализированный для конкретной области применения (в противоположность языку общего назначения, применимому к широкому спектру областей и не учитывающему особенности конкретных сфер знаний). Построение такого языка и/или его структура данных отражают специфику решаемых с его помощью задач. Является ключевым понятием языково-ориентированного программирования.
Инверсия управления (англ. Inversion of Control, IoC) — важный принцип объектно-ориентированного программирования, используемый для уменьшения зацепления в компьютерных программах. Также архитектурное решение интеграции, упрощающее расширение возможностей системы, при котором поток управления программы контролируется фреймворком.
Семанти́ческие веб-се́рвисы (англ. Semantic Web Services, SWS; иногда Semantic Web Web Services, SWWS) — законченные элементы программной логики с однозначно описанной семантикой, доступные через Интернет и пригодные для автоматизированного поиска, композиции и выполнения с учетом их семантики. В тематической литературе часто называются «динамической составляющей семантической паутины».
Пролог (англ. Prolog) — язык и система логического программирования, основанные на языке предикатов математической логики дизъюнктов Хорна, представляющей собой подмножество логики предикатов первого порядка.
Структура данных (англ. data structure) — программная единица, позволяющая хранить и обрабатывать множество однотипных и/или логически связанных данных в вычислительной технике. Для добавления, поиска, изменения и удаления данных структура данных предоставляет некоторый набор функций, составляющих её интерфейс.
Мо́дульное программи́рование — это организация программы как совокупности небольших независимых блоков, называемых модулями, структура и поведение которых подчиняются определённым правилам. Использование модульного программирования позволяет упростить тестирование программы и обнаружение ошибок. Аппаратно-зависимые подзадачи могут быть строго отделены от других подзадач, что улучшает мобильность создаваемых программ.
Дружелюбный русский алгоритмический язык, который обеспечивает наглядность (сокр. ДРАКОН) — визуальный алгоритмический язык программирования и моделирования (см. также: UML).
Виртуальный метод (виртуальная функция) — в объектно-ориентированном программировании метод (функция) класса, который может быть переопределён в классах-наследниках так, что конкретная реализация метода для вызова будет определяться во время исполнения. Таким образом, программисту необязательно знать точный тип объекта для работы с ним через виртуальные методы: достаточно лишь знать, что объект принадлежит классу или наследнику класса, в котором объявлен метод. Одним из переводов слова virtual с.
Процеду́рное программи́рование — программирование на императивном языке, при котором последовательно выполняемые операторы можно собрать в подпрограммы, то есть более крупные целостные единицы кода, с помощью механизмов самого языка.
Транспайлер — тип компилятора, который использует исходный код программы, написанной на одном языке программирования, в качестве исходных данных и производит эквивалентный исходный код на другом языке программирования. Транспайлер переводит между языками программирования, которые работают примерно на одном и том же уровне абстракции, в то время как традиционный компилятор переводит с более высокого уровня языка программирования на язык более низкого уровня. Например, транспайлер может выполнить перевод.
Ненавязчивый JavaScript (англ. unobtrusive JavaScript) является подходом к web-программированию на языке JavaScript. Термин был введён в 2002 году Стюартом Лэнгриджем. Под принципами ненавязчивого Javascript обычно понимаются следующие.
Фре́ймворк, иногда фреймво́рк (англицизм, неологизм от framework «остов, каркас, структура») — заготовки, шаблоны для программной платформы, определяющие архитектуру программной системы; программное обеспечение, облегчающее разработку и объединение разных модулей программного проекта.
Спецификация (стандарт, определение) языка программирования — это предмет документации, который определяет язык программирования, чтобы пользователи и разработчики языка могли согласовывать, что означают программы на данном языке. Спецификации обычно являются подробными и формальными и в основном используются разработчиками языка, в то время как пользователи обращаются к ним в случае двусмысленности: например, спецификация языка C++ часто цитируется пользователями из-за сложности. Сопутствующая документация.
Станда́рт оформле́ния ко́да (станда́рт коди́рования, стиль программи́рования) (англ. coding standards, coding convention или programming style) — набор правил и соглашений, используемых при написании исходного кода на некотором языке программирования. Наличие общего стиля программирования облегчает понимание и поддержание исходного кода, написанного более чем одним программистом, а также упрощает взаимодействие нескольких человек при разработке программного обеспечения.
Таблица виртуальных методов (англ. virtual method table, VMT) — координирующая таблица или vtable — механизм, используемый в языках программирования для поддержки динамического соответствия (или метода позднего связывания).
Интерфейс-маркер, маркер (англ. marker interface pattern) — это шаблон проектирования, применяемый в языках программирования с проверкой типов во время выполнения. Шаблон предоставляет возможность связать метаданные (интерфейс) с классом даже при отсутствии в языке явной поддержки для метаданных.
Паска́ль (англ. Pascal) — один из наиболее известных языков программирования, используется для обучения программированию в старших классах и на первых курсах вузов, является основой для ряда других языков.
Семантический рабочий стол (в информатике) — обобщённый термин, обозначающий идеи, связанные с изменением компьютерных пользовательских интерфейсов и возможностей управления данными так, что обмен ими между различными приложениями или задачами упрощается, и невозможная ранее автоматическая обработка данных одним компьютером становится возможной. Сюда также включаются некоторые идеи о возможности автоматического обмена информацией между людьми. Эта концепция связана с семантической паутиной, но отличается.
Метод Даффа (англ. Duff’s device) в программировании — это оптимизированная реализация последовательного копирования, использующая ту же технику, что применяется для размотки циклов. Первое описание сделано в ноябре 1983 года Томом Даффом (англ. Tom Duff), который в то время работал на Lucasfilm. Пожалуй, это самое необычное использование того факта, что в языке Си инструкции внутри блока switch выполняются «насквозь» через все метки case.
Сниппет (англ. snippet — отрывок, фрагмент) — фрагмент исходного текста или кода программы, применяемый в поисковых системах, текстовых редакторах и средах разработки.
Правило одного определения (One Definition Rule, ODR) — один из основных принципов языка программирования C++. Назначение ODR состоит в том, чтобы в программе не могло появиться два или более конфликтующих между собой определения одной и той же сущности (типа данных, переменной, функции, объекта, шаблона). Если это правило соблюдено, программа ведёт себя так, как будто в ней существует только одно, общее определение любой сущности. Нарушение ODR, если оно не будет обнаружено при компиляции и сборке.
Программи́рование ме́тодом копи́рования-вста́вки, C&P-программирование или копипаста в программировании — процесс создания программного кода с часто повторяющимися частями, произведёнными операциями копировать-вставить (англ. copy-paste). Обычно этот термин используется в уничижительном понимании для обозначения недостаточных навыков компьютерного программирования или отсутствия выразительной среды разработки, в которой, как правило, можно использовать подключаемые библиотеки.
Блокли (англ. Blockly) — это библиотека для создания среды визуального программирования, которая может быть встроена в произвольное веб-приложение. Блокли включает в себя графический редактор, позволяющий составлять программы из блоков, и генераторы кода для подготовки исполнения программы в среде веб-приложения.
Выделение знаний (англ. Knowledge extraction) — это создание знаний из структурированных (реляционных баз данных, XML) и неструктурированных источников (тексты, документы, изображения). Полученное знание должно иметь формат, позволяющий компьютерный ввод, и должно представлять знания так, чтобы облегчить логические выводы. Хотя по методике процесс подобен извлечению информации (обработке естественного языка, англ. Natural language processing, NLP) и процессу «Извлечения, Преобразования, Загрузки.
Рефлексия
Рефлексия представляет собой процесс выявления типов во время выполнения приложения. Каждое приложение содержит набор используемых классов, интерфейсов, а также их методов, свойств и прочих кирпичиков, из которых складывается приложение. И рефлексия как раз и позволяет определить все эти составные элементы приложения. То есть основная задача рефлексии — это исследование типов.
Основной функционал рефлексии сосредоточен в пространстве имен System.Reflection . В нем мы можем выделить следующие основные классы:
- Assembly : класс, представляющий сборку и позволяющий манипулировать этой сборкой
- AssemblyName : класс, хранящий информацию о сборке
- MemberInfo : базовый абстрактный класс, определяющий общий функционал для классов EventInfo, FieldInfo, MethodInfo и PropertyInfo
- EventInfo : класс, хранящий информацию о событии
- FieldInfo : хранит информацию об определенном поле типа
- MethodInfo : хранит информацию об определенном методе
- PropertyInfo : хранит информацию о свойстве
- ConstructorInfo : класс, представляющий конструктор
- Module : класс, позволяющий получить доступ к определенному модулю внутри сборки
- ParameterInfo : класс, хранящий информацию о параметре метода
Эти классы представляют составные блоки типа и приложения: методы, свойства и т.д. Но чтобы получить информацию о членах типа, нам надо воспользоваться классом System.Type .
Класс Type представляет изучаемый тип, инкапсулируя всю информацию о нем. С помощью его свойств и методов можно получить эту информацию. Некоторые из его свойств и методов:
- Метод FindMembers() возвращает массив объектов MemberInfo данного типа
- Метод GetConstructors() возвращает все конструкторы данного типа в виде набора объектов ConstructorInfo
- Метод GetEvents() возвращает все события данного типа в виде массива объектов EventInfo
- Метод GetFields() возвращает все поля данного типа в виде массива объектов FieldInfo
- Метод GetInterfaces() получает все реализуемые данным типом интерфейсы в виде массива объектов Type
- Метод GetMembers() возвращает все члены типа в виде массива объектов MemberInfo
- Метод GetMethods() получает все методы типа в виде массива объектов MethodInfo
- Метод GetProperties() получает все свойства в виде массива объектов PropertyInfo
- Свойство Name возвращает имя типа
- Свойство Assembly возвращает название сборки, где определен тип
- Свойство Namespace возвращает название пространства имен, где определен тип
- Свойство IsArray возвращает true, если тип является массивом
- Свойство IsClass возвращает true, если тип представляет класс
- Свойство IsEnum возвращает true, если тип является перечислением
- Свойство IsInterface возвращает true, если тип представляет интерфейс
Получение типа
Чтобы управлять типом и получать всю информацию о нем, нам надо сперва получить данный тип. Это можно сделать тремя способами: с помощью оператора typeof , с помощью метода GetType() класса Object и применяя статический метод Type.GetType() .
Получение типа через typeof :
Type myType = typeof(Person); Console.WriteLine(myType); // Person public class Person < public string Name < get;>public Person(string name) => Name = name; >
Здесь определен класс Person с некоторой функциональностью. И чтобы получить его тип, используется выражение Type myType = typeof(Person);
Получение типа с помощью метода GetType , унаследованного от класса Object :
Person tom = new Person("Tom"); Type myType = tom.GetType();
В отличие от предыдущего примера здесь, чтобы получить тип, надо создавать объект класса.
И третий способ получения типа — статический метод Type.GetType() :
Type? myType = Type.GetType("Person", false, true);
Первый параметр указывает на полное имя класса с пространством имен. Второй параметр указывает, будет ли генерироваться исключение, если класс не удастся найти. В данном случае значение false означает, что исключение не будет генерироваться. И третий параметр указывает, надо ли учитывать регистр символов в первом параметре. Значение true означает, что регистр игнорируется. Поскольку указанный тип может отсутствовать, то метод возвращает объект nullable-типа
В данном случае класс основной программы и класс Person находятся в глобальном пространстве имен. Однако если тип располагается в другом пространстве имен, то его также надо указать:
Type? myType = Type.GetType("PeopleTypes.Person", false, true); Console.WriteLine(myType); // PeopleTypes.Person namespace PeopleTypes < public class Person < public string Name < get;>public Person(string name) => Name = name; > >
В качестве альтернативы можно применять оператор typeof, передавая в него имя типа с указанием пространства имен:
Type myType = typeof(PeopleTypes.Person);
Если нужный нам тип находится в другой сборке dll, то после полного имени класса через запятую указывается имя сборки:
Type myType = Type.GetType("PeopleTypes.Person, MyLibrary", false, true);
Теперь исследуем тип и получим некоторую информацию о нем.
Type myType = typeof(PeopleTypes.Person); Console.WriteLine($"Name: "); // получаем краткое имя типа Console.WriteLine($"Full Name: "); // получаем полное имя типа Console.WriteLine($"Namespace: "); // получаем пространство имен типа Console.WriteLine($"Is struct: "); // является ли тип структурой Console.WriteLine($"Is class: "); // является ли тип классом namespace PeopleTypes < class Person < public string Name < get; >public Person(string name) => Name = name; > >
Name: Person Full Name: PeopleTypes.Person Namespace: PeopleTypes Is struct: False Is class: True
Поиск реализованных интерфейсов
Чтобы получить все реализованные типом интерфейсы, надо использовать метод GetInterfaces() , который возвращает массив объектов Type:
Type myType = typeof(Person); Console.WriteLine(«Реализованные интерфейсы:»); foreach (Type i in myType.GetInterfaces()) < Console.WriteLine(i.Name); >public class Person : IEater, IMovable < public string Name < get;>public Person(string name) => Name = name; public void Eat() => Console.WriteLine($» eats»); public void Move()=> Console.WriteLine($» moves»); > interface IEater < void Eat(); >interface IMovable
Так как каждый интерфейс представляет объект Type, то для каждого полученного интерфейса можно также применить выше рассмотренные методы для извлечения информации о свойствах и методах
Но пока все примеры выше никак не использовали рефлексию. В следующих темах рассмотрим, как можно с помощью рефлексии получать компоненты типа и обращаться к ним, например, изменять значения приватных полей класса.
Рефлексия программирование Пожалуйста переименуйте эту статью в Отражение программирование Просьба оставлена незарегистр
Просьба оставлена незарегистрированным, неавтоподтверждённым или другим участником, который не имеет права на переименование страниц и считает необходимость такого действия в данном случае очевидной без предварительного обсуждения. Пояснение: Википедия:К переименованию/4 июня 2023#Оспоренный итог.
Переименовать в предложенное название
Эту страницу предлагается переименовать в «Рефлексия (программирование)».
Пояснение причин и обсуждение — на странице Википедия:К переименованию/4 июня 2023. Пожалуйста, основывайте свои аргументы на правилах именования статей. Не удаляйте шаблон до подведения итога обсуждения. Переименовать в предложенное название, снять этот шаблон.
У этого термина существуют и другие значения, см. Отражение.
Для термина «Рефлексия» см. также другие значения.
Отражение (рефлексия; холоним интроспекции, англ. reflection ) — процесс, во время которого программа может отслеживать и модифицировать собственную структуру и поведение во время выполнения. Парадигма программирования, положенная в основу отражения, является одной из форм метапрограммирования и называется рефлексивным программированием.
Во время выполнения программных инструкций (кода) компьютеры обрабатывают данные, что приводит к их изменению, при этом компьютеры не изменяют код. Однако в большинстве современных компьютерных архитектур код хранится как данные, и в некоторых языках программирования реализована возможность обрабатывать собственный код как данные, что приводит к изменению уже самого кода во время его выполнения. Такие самоизменяющиеся программы в основном создаются с помощью высокоуровневых языков программирования, использующих виртуальные машины (например, Smalltalk, скриптовые языки). В меньшей степени рефлексия используется в языках с объявляемыми или статическими типами (например, Си, ML, Haskell, F#).
Понятие рефлексии в языках программирования введено Брайаном Смитом ( Brian Cantwell Smith ) в докторской диссертации 1982 года наряду с понятием метациркулярного вычислителя (англ. Meta-circular evaluator ) как компонента 3-Lisp.
Рефлексивно-ориентированное программирование править
Рефлексивно-ориентированное программирование, или рефлексивное программирование, — функциональное расширение парадигмы объектно-ориентированного программирования. Рефлексивно-ориентированное программирование включает в себя самопроверку, самомодификацию и самоклонирование. Тем не менее главное достоинство рефлексивно-ориентированной парадигмы заключается в динамической модификации программы, которая может быть определена и выполнена во время работы программы. Некоторые императивные подходы, например процедурная и объектно-ориентированная парадигмы программирования, указывают, что существует четкая предопределённая последовательность операций обработки данных. Парадигма рефлексивно-ориентированного программирования, тем не менее, добавляет возможность динамической модификации программных инструкций во время работы и их вызова в модифицированном виде. То есть программная архитектура сама определяет, что именно можно делать во время работы исходя из данных, сервисов и специфических операций.
Применение править
Рефлексия может использоваться для наблюдения и изменения программы во время выполнения. Рефлексивный компонент программы может наблюдать за выполнением определённого участка кода и изменять себя для достижения желаемой цели. Модификация выполняется во время выполнения программы путём динамического изменения кода.
Рефлексию можно применять и для динамической адаптации программы к различным ситуациям. Например, рассмотрим программу, использующую два разных класса X и Y для выполнения аналогичных операций. Без рефлексии в коде программы методы классов X и Y будут вызываться явно. Если программа спроектирована с применением рефлексивно-ориентированной парадигмы программирования, некоторый участок кода не будет содержать явных вызовов методов классов X и Y ; программа выполнит этот участок дважды: сначала для класса X , затем для класса Y .
Примером, проясняющим преимущества рефлексии, может служить Сериализация объекта в JSON. Без рефлексии необходимо было бы явным образом указывать все имена полей класса и ссылаться на их значения для сериализации. Но рефлексия позволяет программе самой определить все имеющиеся поля и получить их текстовые имена. Таким образом, сериализация становится доступна для любого объекта без написания лишнего кода.
Реализации править
Программы, написанные на языках программирования, поддерживающих рефлексию, наделены дополнительными возможностями, реализация которых на языках низкого уровня затруднительна. Перечислим некоторые из них:
- поиск и модификация конструкций исходного кода (блоков, классов, методов, интерфейсов (протоколов) и т. п.) как объектов первого класса во время выполнения;
- изменение имён классов и функций во время выполнения;
- анализ и выполнение строк кода, поступающих извне;
- создание интерпретаторабайткода нового языка.
Реализованы эти возможности могуть быть разными путями. В языке MOO рефлексия является частью ежедневной идиомы программирования. Все вызываемые методы получают в контексте информацию о том, откуда они вызваны, и ссылки на объекты, к которым они принадлежат. Безопасность контролируется программно с помощью стека вызовов: вызывается callers() для получения списка методов; проверяется, не заблокировал ли callers()[1] сам себя.
Компилируемые языки полагаются на свои среды выполнения, обеспечивающие программы информацией об их исходном коде. Скомпилированный на Objective-C выполняемый файл, например, записывает имена всех методов в один блок, создаёт таблицу соответствия. В компилируемых языках, поддерживающих создание функций во время выполнения, таких как Common Lisp, среда выполнения должна включать компилятор и интерпретатор.
Реализация рефлексии на языках, её не поддерживающих, выполняется с помощью системы трансформации программы для автоматического отслеживания изменений исходного кода.
Примеры править
Пример на C#, в котором создаётся экземпляр foo класса Foo и осуществляется вызов метода Hello , не использующий рефлексию и использующий её:
// Без рефлексии new Foo().Hello(); // С рефлексией Type type = System.Type.GetType("Foo"); var foo = Activator.CreateInstance(type); foo.GetType().GetMethod("Hello").Invoke(foo, null);
// Без рефлексии new Foo().hello() // С рефлексией // с допущением, что Foo лежит в this new this['Foo']()['hello']() // без допущений new (eval('Foo'))()['hello']()
Примечания править
- Руководство Мета Халлбата англ. Matt Hurlbutt по поведенческой рефлексии и её реализации (англ.)
- , кандидатская диссертация, «Процедурная рефлексия в языках программирования», Массачусетский технологический институт, факультет электротехники и информатики, 1982 (англ.)
- (неопр.) . Дата обращения: 15 января 2011.Архивировано из оригинала 13 декабря 2015 года.
Литература править
- Forman, Ira R. and Forman, Nate. Java Reflection in Action. — Manning Publications Co., 2004. — ISBN 1932394184.
- Forman, Ira R. and Danforth, Scott H. Putting Metaclasses to Work: A New Dimension in Object-oriented Programming. — Addison Wesley Longman Publishing Co., Inc., 1999. — ISBN 0-201-43305-2.
Ссылки править
- Jonathan M. Sobel and Daniel P. Friedman. (1996), Indiana University.
- Reflection in logic, functional and object-oriented programming: a short comparative study от 5 декабря 2006 на Wayback Machine
- Brian Foote’s pages on Reflection in Smalltalk от 27 ноября 2020 на Wayback Machine
- Java Reflection Tutorial от 27 февраля 2009 на Wayback Machine from Sun Microsystems
- Перевести текст с иностранного языка на русский.
- Найти и оформить в виде сносок ссылки на независимые авторитетные источники, подтверждающие написанное.
- Оформить статью по правилам.
После исправления проблемы исключите её из списка. Удалите шаблон, если устранены все недостатки.
Эта статья или раздел нуждается в переработке.
Пожалуйста, улучшите статью в соответствии с правилами написания статей. ( май 2010 )
Википедия, чтение, книга, библиотека, поиск, нажмите, истории, книги, статьи, wikipedia, учить, информация, история, скачать, скачать бесплатно, mp3, видео, mp4, 3gp, jpg, jpeg, gif, png, картинка, музыка, песня, фильм, игра, игры
Дата публикации: Ноябрь 10, 2023, 03:23 am
Самые читаемые
Campbell-Railton Blue Bird
Caloboletus radicans
Calidris tenuirostris
Cadillac Calais
Const cast
Connie Talbot
Compute Node Linux
Comastoma
CoMix Wave Inc
Covert Action Rule
© Copyright 2021, Все права защищены.
Pozhalujsta pereimenujte etu statyu v Otrazhenie programmirovanie Prosba ostavlena nezaregistrirovannym neavtopodtverzhdyonnym ili drugim uchastnikom kotoryj ne imeet prava na pereimenovanie stranic i schitaet neobhodimost takogo dejstviya v dannom sluchae ochevidnoj bez predvaritelnogo obsuzhdeniya Poyasnenie Vikipediya K pereimenovaniyu 4 iyunya 2023 Osporennyj itog Pereimenovat v predlozhennoe nazvanieEtu stranicu predlagaetsya pereimenovat v Refleksiya programmirovanie Poyasnenie prichin i obsuzhdenie na stranice Vikipediya K pereimenovaniyu 4 iyunya 2023 Pozhalujsta osnovyvajte svoi argumenty na pravilah imenovaniya statej Ne udalyajte shablon do podvedeniya itoga obsuzhdeniya Pereimenovat v predlozhennoe nazvanie snyat etot shablon U etogo termina sushestvuyut i drugie znacheniya sm Otrazhenie Dlya termina Refleksiya sm takzhe drugie znacheniya Otrazhenie refleksiya holonim introspekcii angl reflection process vo vremya kotorogo programma mozhet otslezhivat i modificirovat sobstvennuyu strukturu i povedenie vo vremya vypolneniya Paradigma programmirovaniya polozhennaya v osnovu otrazheniya yavlyaetsya odnoj iz form metaprogrammirovaniya 1 i nazyvaetsya refleksivnym programmirovaniem Vo vremya vypolneniya programmnyh instrukcij koda kompyutery obrabatyvayut dannye chto privodit k ih izmeneniyu pri etom kompyutery ne izmenyayut kod Odnako v bolshinstve sovremennyh kompyuternyh arhitektur kod hranitsya kak dannye i v nekotoryh yazykah programmirovaniya realizovana vozmozhnost obrabatyvat sobstvennyj kod kak dannye chto privodit k izmeneniyu uzhe samogo koda vo vremya ego vypolneniya Takie samoizmenyayushiesya programmy v osnovnom sozdayutsya s pomoshyu vysokourovnevyh yazykov programmirovaniya ispolzuyushih virtualnye mashiny naprimer Smalltalk skriptovye yazyki V menshej stepeni refleksiya ispolzuetsya v yazykah s obyavlyaemymi ili staticheskimi tipami naprimer Si ML Haskell F Ponyatie refleksii v yazykah programmirovaniya vvedeno Brajanom Smitom Brian Cantwell Smith v doktorskoj dissertacii 1982 goda 2 3 naryadu s ponyatiem metacirkulyarnogo vychislitelya angl Meta circular evaluator kak komponenta 3 Lisp Soderzhanie 1 Refleksivno orientirovannoe programmirovanie 2 Primenenie 3 Realizacii 4 Primery 5 Primechaniya 6 Literatura 7 SsylkiRefleksivno orientirovannoe programmirovanie pravitRefleksivno orientirovannoe programmirovanie ili refleksivnoe programmirovanie funkcionalnoe rasshirenie paradigmy obektno orientirovannogo programmirovaniya Refleksivno orientirovannoe programmirovanie vklyuchaet v sebya samoproverku samomodifikaciyu i samoklonirovanie Tem ne menee glavnoe dostoinstvo refleksivno orientirovannoj paradigmy zaklyuchaetsya v dinamicheskoj modifikacii programmy kotoraya mozhet byt opredelena i vypolnena vo vremya raboty programmy Nekotorye imperativnye podhody naprimer procedurnaya i obektno orientirovannaya paradigmy programmirovaniya ukazyvayut chto sushestvuet chetkaya predopredelyonnaya posledovatelnost operacij obrabotki dannyh Paradigma refleksivno orientirovannogo programmirovaniya tem ne menee dobavlyaet vozmozhnost dinamicheskoj modifikacii programmnyh instrukcij vo vremya raboty i ih vyzova v modificirovannom vide To est programmnaya arhitektura sama opredelyaet chto imenno mozhno delat vo vremya raboty ishodya iz dannyh servisov i specificheskih operacij Primenenie pravitRefleksiya mozhet ispolzovatsya dlya nablyudeniya i izmeneniya programmy vo vremya vypolneniya Refleksivnyj komponent programmy mozhet nablyudat za vypolneniem opredelyonnogo uchastka koda i izmenyat sebya dlya dostizheniya zhelaemoj celi Modifikaciya vypolnyaetsya vo vremya vypolneniya programmy putyom dinamicheskogo izmeneniya koda Refleksiyu mozhno primenyat i dlya dinamicheskoj adaptacii programmy k razlichnym situaciyam Naprimer rassmotrim programmu ispolzuyushuyu dva raznyh klassa X i Y dlya vypolneniya analogichnyh operacij Bez refleksii v kode programmy metody klassov X i Y budut vyzyvatsya yavno Esli programma sproektirovana s primeneniem refleksivno orientirovannoj paradigmy programmirovaniya nekotoryj uchastok koda ne budet soderzhat yavnyh vyzovov metodov klassov X i Y programma vypolnit etot uchastok dvazhdy snachala dlya klassa X zatem dlya klassa Y Primerom proyasnyayushim preimushestva refleksii mozhet sluzhit Serializaciya obekta v JSON Bez refleksii neobhodimo bylo by yavnym obrazom ukazyvat vse imena polej klassa i ssylatsya na ih znacheniya dlya serializacii No refleksiya pozvolyaet programme samoj opredelit vse imeyushiesya polya i poluchit ih tekstovye imena Takim obrazom serializaciya stanovitsya dostupna dlya lyubogo obekta bez napisaniya lishnego koda Realizacii pravitProgrammy napisannye na yazykah programmirovaniya podderzhivayushih refleksiyu nadeleny dopolnitelnymi vozmozhnostyami realizaciya kotoryh na yazykah nizkogo urovnya zatrudnitelna Perechislim nekotorye iz nih poisk i modifikaciya konstrukcij ishodnogo koda blokov klassov metodov interfejsov protokolov i t p kak obektov pervogo klassa vo vremya vypolneniya izmenenie imyon klassov i funkcij vo vremya vypolneniya analiz i vypolnenie strok koda postupayushih izvne sozdanie interpretatora bajtkoda novogo yazyka Realizovany eti vozmozhnosti mogut byt raznymi putyami V yazyke MOO refleksiya yavlyaetsya chastyu ezhednevnoj idiomy programmirovaniya Vse vyzyvaemye metody poluchayut v kontekste informaciyu o tom otkuda oni vyzvany i ssylki na obekty k kotorym oni prinadlezhat Bezopasnost kontroliruetsya programmno s pomoshyu steka vyzovov vyzyvaetsya callers dlya polucheniya spiska metodov proveryaetsya ne zablokiroval li callers 1 sam sebya Kompiliruemye yazyki polagayutsya na svoi sredy vypolneniya obespechivayushie programmy informaciej ob ih ishodnom kode Skompilirovannyj na Objective C vypolnyaemyj fajl naprimer zapisyvaet imena vseh metodov v odin blok sozdayot tablicu sootvetstviya V kompiliruemyh yazykah podderzhivayushih sozdanie funkcij vo vremya vypolneniya takih kak Common Lisp sreda vypolneniya dolzhna vklyuchat kompilyator i interpretator Realizaciya refleksii na yazykah eyo ne podderzhivayushih vypolnyaetsya s pomoshyu sistemy transformacii programmy dlya avtomaticheskogo otslezhivaniya izmenenij ishodnogo koda Primery pravitPrimer na C v kotorom sozdayotsya ekzemplyar foo klassa Foo i osushestvlyaetsya vyzov metoda Hello ne ispolzuyushij refleksiyu i ispolzuyushij eyo Bez refleksii new Foo Hello S refleksiej Type type System Type GetType Foo var foo Activator CreateInstance type foo GetType GetMethod Hello Invoke foo null Analogichnyj primer dlya ECMAScript JavaScript i ActionScript Bez refleksii new Foo hello S refleksiej s dopusheniem chto Foo lezhit v this new this Foo hello bez dopushenij new eval Foo hello Primechaniya pravit Rukovodstvo Meta Hallbata angl Matt Hurlbutt po povedencheskoj refleksii i eyo realizacii angl kandidatskaya dissertaciya Procedurnaya refleksiya v yazykah programmirovaniya Massachusetskij tehnologicheskij institut fakultet elektrotehniki i informatiki 1982 angl Brian C Smith Refleksiya i semantiki v procedurnyh yazykah programmirovaniya Sluzhebnyj otchyot MIT LCS TR 272 Massachusetskij tehnologicheskij institut Kembridzh Mass yanvar 1982 angl neopr Data obrasheniya 15 yanvarya 2011 Arhivirovano iz originala 13 dekabrya 2015 goda Literatura pravitForman Ira R and Forman Nate Java Reflection in Action Manning Publications Co 2004 ISBN 1932394184 Forman Ira R and Danforth Scott H Putting Metaclasses to Work A New Dimension in Object oriented Programming Addison Wesley Longman Publishing Co Inc 1999 ISBN 0 201 43305 2 Ssylki pravitJonathan M Sobel and Daniel P Friedman An Introduction to Reflection Oriented Programming 1996 Indiana University Reflection in logic functional and object oriented programming a short comparative study Arhivnaya kopiya ot 5 dekabrya 2006 na Wayback Machine An Introduction to Reflection Oriented Programming Brian Foote s pages on Reflection in Smalltalk Arhivnaya kopiya ot 27 noyabrya 2020 na Wayback Machine Java Reflection Tutorial Arhivnaya kopiya ot 27 fevralya 2009 na Wayback Machine from Sun MicrosystemsDlya uluchsheniya etoj stati zhelatelno Perevesti tekst s inostrannogo yazyka na russkij Najti i oformit v vide snosok ssylki na nezavisimye avtoritetnye istochniki podtverzhdayushie napisannoe Oformit statyu po pravilam Posle ispravleniya problemy isklyuchite eyo iz spiska Udalite shablon esli ustraneny vse nedostatki Eta statya ili razdel nuzhdaetsya v pererabotke Pozhalujsta uluchshite statyu v sootvetstvii s pravilami napisaniya statej maj 2010 Istochnik https ru wikipedia org w index php title Refleksiya programmirovanie amp oldid 133783975