Во-первых, эти атрибуты не нужны для манипуляций с байт-кодом в целом. Они могут запрашивать специальные функции для java-агентов, используя функцию instrumentation JVM. Например. создание новых классов путем сборки байт-кода работает без них.
Redefinition означает, что в произвольный момент времени агент будет вызывать Instrumentation. redefineClasses
, чтобы изменить фактическое определение существующих (и уже загруженных) классов. Агент предоставит байт-код для нового определения.
Ретрансформация относится к процессу преобразования файлов классов, который обычно применяется в классе время загрузки. Агенты могут регистрировать ClassFileTransformer
s, которые вызываются один за другим, чтобы применить преобразования к байтовому коду до того, как класс будет инициализирован. Итак, Retransformation относится к возможности JVM повторять этот процесс для уже загруженных классов. В этом случае агент может вызывать Instrumentation.retransformClasses
, указав, какие классы необходимо преобразовать, но не байт-код. Вместо этого JVM будет вызывать все зарегистрированные ретрансляционные операции ClassFileTransformer
с, предоставляя фактический байт-код (или результат предыдущего трансформатора для цепного трансформатора).
Setting a native method prefix еще более особенный; это может быть полезно при использовании собственных методов.
Итак, вы видите, маловероятно, что вам действительно нужно всегда использовать все эти функции при игре с байт-кодом.
Спасибо, это объясняет все, что я думаю :) – maslan