Джава. Ограничения на переопределение класса
Спецификация 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).