Какие рамки (а также ассоциированные языки) поддерживают замену класса?

StackOverflow https://stackoverflow.com/questions/3043451

Вопрос

Я пишу свой мастер-тезис, который занимается AOP в .NET, среди прочего, и я упоминаю отсутствие поддержки замены классов при загрузке в качестве важного фактора в том, что в настоящее время нет .NET AOP Frameworks, которые выполнить истинное динамическое плетение - не вложение требований, которые тканые классы должны продлеваться ContextBoundObject или MarshalByRefObject или подвергать всю их семантику на интерфейс.

Однако вы можете сделать это с Java в JVM благодаря ClassFileTransformer:

  • Вы продлите ClassFileTransformer.
  • Вы подпишитесь на событие нагрузки класса.
  • На нагрузке класса вы переписываете класс и замените его.

Все это очень хорошо, но мой проектный директор спросил меня, вполне в последнюю минуту, чтобы дать ему список рамок (и ассоциированных языков), которые делают / не поддерживают замену класса. У меня действительно нет времени искать это сейчас: я бы не чувствовал себя комфортно, просто делая поверхностные исследования и потенциально вкладываю ошибочную информацию в моем тезисе.

Поэтому я спрашиваю вас, Ой Всемогущий сообщество программирования, вы можете помочь? Конечно, я не прошу вас исследовать это сами. Просто, если вы знаете для уверенности Что конкретная рамка поддерживает / не поддерживает это, оставьте его как ответ. Если вы не уверены, пожалуйста, не забудьте указать это.

Огромное спасибо!


Редактировать: @ewernli.

  • Я спрашиваю о (2).
  • В C # вы можете действительно выдавать код во время выполнения и динамически создавать новые классы, но они являются новый Классы, они не заменяют существующий класс. Что я хотел бы сделать, это преобразовать класс при нагрузке, как вы можете сделать в Java с ClassFileTransformer.
  • О модификации подписи метода: Да, вы правы. Я должен был упомянуть, что в моем случае я не хочу изменять интерфейс класса, а скорее содержание его методов.

Ваш ответ был действительно полезным. Спасибо :)

Это было полезно?

Решение

Вы спрашиваете о (1) замене True Class во время выполнения или (2) средства для преобразования класса, когда он загружен или (3) языки, которые поддерживают нагрузку динамического класса?

Java поддерживает динамический класс нагрузки с ClassLoader, преобразование с ClassFileTransformer, но нет настоящей замены класса.

Я не уверен в C #, но я думаю, что вы можете излучать код во время выполнения и динамически создавать новый класс, поэтому вы можете достичь (3) и, вероятно, (2).

Настоящий замена класса в основном поддерживается только динамический язык, например, SmallTalk, Ruby, я думаю, Python и несколько других. Это требует преобразования экземпляров класса соответствовать новой форме. Они обычно инициализируют новые поля для Nil, если класс изменяется.

AFAIK, динамические языки портированы в JVM, делают обширное взлом классов для поддержки замены класса во время выполнения. Для jruby см. Первый вкус призванного динамического Чтобы получить больше указателей, как они это делают сейчас, то, что проблематично и как предстоящий invokedynamic может помочь.

Это не предлагается на статически набранных языках из-за осложнений с Тип Система. Отказ Если метод подписи изменения в классе, другие существующие классы уже загружены, могут не надо соответствовать новой подписи метода, которая не является безопасной. В Java вы можете изменить метод до тех пор, пока подпись такая же, используя Архитектура отладчика платформы Java.

Было несколько попыток добавить эту функцию в Java, а также / или статически напечатанные языки:

  • Поддержка времени выполнения для безопасных динамических классов Java
  • Поддержка непредвиденных динамической адаптации поведения приложения
  • Техника для динамического обновления программного обеспечения Java

Эта статья предоставляет общий обзор связанных проблем

  • В жидких системах типа на динамическом эволюции программного обеспечения

Не уверен точно, если это решает вам первоначальный вопрос, но эти указатели могут быть интересны для вашего тезиса в любом случае.

Другие советы

Java язык не поддерживает замену файла класса. JVM предоставляет функцию через указываемые классы. Поэтому все Языки, которые были перенесены на JVM может воспользоваться этим.

Erlang Поддерживает замену горячего кода, и если вы смотрите также на теоретические рамки, которые моделируют обновления динамического класса, вы можете взглянуть на Криол Язык (интерпретируется).

Библиотека Runtime Objective-C поддерживает динамическое строительство и регистрацию классов, регистрации ленивого метода и «способность метода», по которому метод реализации могут быть переключены во время выполнения. Предыдущие версии поддерживают «Class Swizled», с помощью которого класс может быть заменен другим во время выполнения, но теперь используется метод Spizzling вместо этого. Вот эталонный документ.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top