инструментарий байт-кода с использованием ClassFileTransformer.transform - PullRequest
6 голосов
/ 08 апреля 2009

Я написал класс с premain методом, и внутри этого метода я добавил ClassFileTransformer к Instrumentation (Instrumentation.addTransformer()).

Я вызвал приложение, используя

java -javaagent:<path_to_agnet.jar> <application>

Однако ClassFileTransformer.transform() метод не вызывается.
Я заметил, что premain вызывается.
Я также заметил, что если я звоню Instrumentation.retransformClasses(), то вызывается ClassFileTransformer.transform().
При первом определении (Classloader.defineClass()) метод transform() не вызывается.

Любая подсказка, что может быть не так?

Примечание. Я могу опубликовать исходный код, если он вам поможет.

С уважением, Rejeev.

1 Ответ

4 голосов
/ 08 апреля 2009

Возможные причины

.

Неверный манифест

Вы выполнили все необходимые шаги , чтобы определить класс Инструментов?

Особенно этап «упаковки», который включает в себя указание немного другого набора атрибутов в манифесте JAR:

  • Вместо Main-Class вы должны указать атрибут Premain-Class, который дает полное имя класса, который реализует premain() в вашем агенте.
Premain-Class: my.package.MyAgentClass
  • Если ваш агент использует какие-либо библиотеки классов, вам следует указать атрибут Boot-Class-Path, поскольку вашему инструментальному агенту потребуется, чтобы его библиотеки были видны из загрузчика классов начальной загрузки.
    Если вы этого не сделаете, вам, вероятно, придется использовать странный аргумент -Xbootclasspath/a:... для JVM.
    Аргумент командной строки - неплохой способ добиться успеха, но вы хотите использовать этот атрибут в долгосрочной перспективе, потому что командная строка уже растет от необходимости указывать агент инструментария Java. И пусть это будет как можно проще.

  • Наконец, есть атрибут Can-Redefine-Classes.
    Если для него установлено значение true, агент инструментария Java может переопределить классы, которые использует сам агент.
    Это довольно странное обстоятельство, и, конечно, много не возникнет.

.

Silent Exception

( Реджеев Дивакаран получил это).

Я использовал classBeingRedefined.getName(), чтобы напечатать имя класса.
classBeingRedefined равно null при первой загрузке .

Суть в том, что * * * * * * * * * * * * * * * * * * * * * * *. Это будет молча съедено .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...