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.