Какие рамки (и связанные языки) поддерживают замену классов? - PullRequest
2 голосов
/ 15 июня 2010

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

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

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

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

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

Большое спасибо!


РЕДАКТИРОВАТЬ: @ ewernli

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

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

Ответы [ 4 ]

4 голосов
/ 15 июня 2010

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

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

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

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

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

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

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

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

В этом документе представлен общий обзор связанных проблем

  • Влияние систем типов на динамическое развитие программного обеспечения

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

2 голосов
/ 15 июня 2010

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

1 голос
/ 15 июня 2010

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

1 голос
/ 15 июня 2010

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...