2013-11-19 3 views
3

Мне нравится делать некоторые обучающие инструкции по модификации байт-кода Java. Все они заявляют, что мне нужно иметь следующие манифестные атрибуты: Can-Redefine-Classes: true Can-Retransform-Classes: true Can-Set-Native-Method-Prefix: true Все в порядке, но нет из учебных пособий объясняют, что именно делают атрибуты. Документация оракула довольно лаконична, за исключением Can-Set-Native-Method-Prefix: true, которое, как я полагаю, позволяет также использовать собственные методы, поскольку они не могут быть просто изменены как методы Java ...Записи манифеста об управлении байтовым кодом

Может ли кто-нибудь объяснить, в чем разница между переопределением и ретрансформацией классов?

ответ

4

Во-первых, эти атрибуты не нужны для манипуляций с байт-кодом в целом. Они могут запрашивать специальные функции для java-агентов, используя функцию instrumentation JVM. Например. создание новых классов путем сборки байт-кода работает без них.

Redefinition означает, что в произвольный момент времени агент будет вызывать Instrumentation. redefineClasses, чтобы изменить фактическое определение существующих (и уже загруженных) классов. Агент предоставит байт-код для нового определения.

Ретрансформация относится к процессу преобразования файлов классов, который обычно применяется в классе время загрузки. Агенты могут регистрировать ClassFileTransformers, которые вызываются один за другим, чтобы применить преобразования к байтовому коду до того, как класс будет инициализирован. Итак, Retransformation относится к возможности JVM повторять этот процесс для уже загруженных классов. В этом случае агент может вызывать Instrumentation.retransformClasses, указав, какие классы необходимо преобразовать, но не байт-код. Вместо этого JVM будет вызывать все зарегистрированные ретрансляционные операции ClassFileTransformer с, предоставляя фактический байт-код (или результат предыдущего трансформатора для цепного трансформатора).

Setting a native method prefix еще более особенный; это может быть полезно при использовании собственных методов.

Итак, вы видите, маловероятно, что вам действительно нужно всегда использовать все эти функции при игре с байт-кодом.

+0

Спасибо, это объясняет все, что я думаю :) – maslan

Смежные вопросы