openjdk.ruOpenJDK на русском

JEP 159: Enhanced Class Redefinition

Расширенное переопределение классов

ОтветственныйThomas Wuerthinger
ТипFeature
ОбластьImplementation
СтатусClosed / Withdrawn
Компонентhotspot / jvmti
Обсуждениеserviceability dash dev at openjdk dot java dot net
РецензентыChristian Thalinger, Coleen Phillimore, Douglas Simon, John Rose, Mikael Vidstedt, Staffan Friberg, Tim Quinn
Создан2011/07/27 20:00
Обновлён2020/09/01 18:36
Задача8046149

Аннотация

Расширить возможности переопределения классов в HotSpot VM, чтобы во время выполнения можно было добавлять супертипы, а также добавлять и удалять методы и поля.

Что не является целью

Добавление новых API в JVMTI, JDWP, JDI или пакет java.lang.instrument не является целью. Новый механизм будет доступен через существующие интерфейсы переопределения классов.

Мотивация

Текущие возможности переопределения классов позволяют только заменять тела методов, и это серьёзное ограничение. Предлагаемая возможность ослабляет это ограничение и повышает продуктивность Java-программистов при разработке приложения: после изменений больше не нужно перезапускать приложение. Особенно велика польза при разработке на сервере приложений или для приложений с долгим запуском.

Описание

Предлагаемая возможность улучшает реализацию функциональности переопределения классов JVMTI в HotSpot VM. Она не изменяет ни Java API, ни интерфейсы библиотек или JVM.

В частности, предлагаемое улучшение переопределения классов включает возможность изменять классы во время выполнения следующими способами:

  • добавление и удаление методов;
  • добавление и удаление статических полей и полей экземпляра;
  • добавление супертипов.

Поведение текущего механизма замены тел методов не меняется. Удалять супертипы из класса по-прежнему запрещено.

Добавление или удаление полей экземпляра затрагивает все существующие экземпляры класса. Новые поля инициализируются значением 0, null или false в зависимости от их типа. Вызов метода после его удаления или обращение к полю после его удаления приводит соответственно к NoSuchMethodError или NoSuchFieldError.

Технические детали предлагаемой реализации описаны в нескольких публикациях:

Кроме того, существует прототип Dynamic Code Evolution VM, который полностью поддерживает предлагаемые возможности и доступен для загрузки в виде исходного кода и двоичных файлов.

Тестирование

Помимо текущих тестов переопределения классов, нужны новые тесты для расширенной функциональности (то есть тесты, которые добавляют и удаляют поля и методы и добавляют супертипы).

Влияние

Это предложение затрагивает только реализацию HotSpot VM и не затрагивает другие компоненты JDK. Оно незначительно затрагивает документацию API функциональности переопределения классов в JVMTI, JDWP, JDI и API java.lang.instrument.