Джава. Ограничения на переопределение класса

Спецификация API Java Platform SE 5 для метода Instrumentation.redefineClasses(ClassDefinition[]) говорит:

Переопределение может изменить тела метода, постоянный пул и атрибуты. Переопределение не должно добавлять, удалять или переименовывать поля или методы, изменять сигнатуры методов или изменять наследование.

Что подразумевается под attributes? Я предположил, что это могут быть модификаторы доступа (private, public,...), синхронизированные, final и другие модификаторы. Но если я попытаюсь переопределить не только тело метода, но и его модификатор доступа или модификатор доступа к классу, или попытаться сделать метод синхронизированным, я получу

java.lang.UnsupportedOperationException: class redefinition failed: attempted to change method modifiers
        at sun.instrument.InstrumentationImpl.redefineClasses0(Native Method)
        at sun.instrument.InstrumentationImpl.redefineClasses(Unknown Source)

Так что же attributes в данном контексте?

2 ответа

Решение

J2SE5 в настоящее время поддерживает только модификацию тела метода и значения полей. Если вы модифицируете модификаторы доступа, это означает, что вы полностью измените интерфейс класса.

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

Класс переопределения предоставляет динамический способ изменить поведение во время выполнения существующей системы. Широко используется АОП, я думаю.

Атрибуты представляют собой фрагменты дополнительной информации, добавленной к классам, методам и полям в файле классов. См. Спецификацию java vm http://docs.oracle.com/javase/specs/jvms/se7/html/jvms-4.html. В Приложении A.3 также есть краткое описание атрибутов в руководстве пользователя ASM ( http://download.forge.objectweb.org/asm/asm4-guide.pdf).

Другие вопросы по тегам