Вы спрашиваете (1) об истинной замене класса во время выполнения или (2) средствах преобразования класса при его загрузке или (3) языках, которые поддерживают динамическую загрузку классов?
Java поддерживает динамическую загрузку классов с ClassLoader
, преобразование с ClassFileTransformer
, но без истинной замены классов.
Я не уверен в C #, но я думаю, что вы можете генерировать код во время выполнения и динамически создавать новый класс, чтобы вы могли достичь (3) и, вероятно, (2).
Истинная замена класса в основном поддерживается только динамическим языком , например Smalltalk, Ruby, я думаю, Python и несколько других. Это требует преобразования экземпляров класса для соответствия новой форме. Они обычно инициализируют новые поля нулем, если класс изменяется.
AFAIK, динамические языки, перенесенные в JVM, делают обширный взлом ClassLoader для поддержки замены классов во время выполнения. Для JRuby см. Первый вариант вызова динамического , чтобы узнать больше о том, как они это делают сейчас, что проблематично и как может помочь предстоящий invokedynamic
.
Это не предлагается в статически типизированных языках из-за сложности с системой типов . Если сигнатура метода изменяется в классе, другие уже загруженные существующие классы могут не соответствовать новой сигнатуре метода, которая небезопасна. Однако в Java вы можете изменить метод, если сигнатура будет одинаковой, используя Архитектура отладчика платформы Java .
Была предпринята попытка добавить эту функцию в Java и / или языки со статической типизацией:
- Поддержка времени выполнения для безопасных типов динамических классов Java
- Поддержка непредвиденной динамической адаптации поведения приложения
- Методика динамического обновления программного обеспечения Java
В этом документе представлен общий обзор связанных проблем
- Влияние систем типов на динамическое развитие программного обеспечения
Не уверен, точно ли это отвечает на ваш первоначальный вопрос, но эти указатели могут быть интересны для вашей диссертации в любом случае.