2013-08-09 5 views
6

Насколько я знаю и понимаю,Статические языки и отражения

Отражение является возможность создавать/изменять исходный код во время выполнения.

Материал из Википедии:

  • Discover и изменять исходный код конструкции (такие как блоки кода, классов, методов, протоколов и т.д.) в качестве объекта первого класса в выполнения.
  • Преобразование строки, соответствующей символическому названию класса или функции , в ссылку или вызов этого класса или функции.
  • Оцените строку, как если бы это была инструкция исходного кода во время выполнения.
    Создайте новый интерпретатор для байт-кода языка, чтобы дать новое значение или цель для конструкции программирования.

Динамические языки являются языки, которые мы можем Eval (оценить непосредственно из строки) во время выполнения.

Из википедии: «расширение программы, путем добавления нового кода, путем расширения объектов и определения, или путем изменения системы типа»

Хорошо, теперь мой вопрос: Как статический язык ד (без способность eval) может иметь отражение (например, Java)? (новый исходный код не оценивается?: /)

Заранее благодарим!

+0

Java имеет библиотеку обработки байтового кода, называемую [ASM] (http://asm.ow2.org/).Отражение не используется для добавления нового кода, как вы описываете в своем вопросе. –

+1

Отражение позволяет взломать (да, это может быть вредно в некоторых случаях) с классом, запросив о его методах, полях, уровнях доступа и т. Д., Но вы не генерируете новый код_. Он имеет другие функции, такие как, например, вызов метода, определенного в определенном классе, основанного только на данных о нем (* метаданных *). Вы получаете экземпляр класса, вы получаете от него метод на основе его фирмы, а затем вы вызываете его. – Gamb

+0

@ Gamb 10x, но если u изменить исходный код, значит, вы создаете исходный код (как говорит Википедия), не так ли? – gran33

ответ

4

Я думаю, что описание википедии на самом деле не очень хорошо сформулировано.

Отражение (или интроспекция) не о создании кода во время выполнения, а о способности кода отражать на себе во время выполнения (и модифицировать его поведение на основе этого). В качестве примеров можно получить информацию о типе объекта (например, RTTI в C++) или получить метаданные, связанные с объектом (например, аннотации в Java).

Генерация кода времени больше связана с первоклассностью, чем с отражением, поэтому я бы сказал, что текущая статья в википедии является чем-то вводящим в заблуждение.

UPDATE

Другими словами ответить на это:

Хорошо, теперь, мой вопрос, как может статический язык (без возможности Eval) может иметь отражение (например Java)?

... было бы то, что отражение не зависит от способности evel. Это два отдельных языка.

А также, как отметил Джулио Франко в комментариях - Java способна генерировать код времени выполнения (манипулирование временем выполнения) (см., Например, CGLIB).

+1

Я хотел бы добавить, что классы Java загружаются во время выполнения, и есть класс Java, который позволяет вам скомпилировать и загрузить класс Java на лету. Итак, на самом деле Java ** может ** добавить код во время выполнения. Возможно, вы также можете удалить, изменить и перезагрузить класс, но я думаю, что у этого есть некоторые ограничения (возможно, вы не можете выгрузить текущий класс). –

Смежные вопросы