Ответ 1
Java-код компилируется в байт-код (Foo.java ->> Foo.class
). Инъекция Bytecode модифицирует Foo.class
во время выполнения, чтобы ввести код в нее прямо перед ее загрузкой и запуском.
Представьте себе сценарий, в котором я хочу узнать, сколько раз метод
public void bar();
вызывается в Foo.class
. Я мог написать агент, использующий java.lang.instrument
, который перехватывает Foo.class
во время загрузки класса, изменяет его с помощью ASM, чтобы bar()
вызывал com.amir.agent.incrementCount()
при вводе метода.
Теперь я могу запустить свою программу:
$java -javagent:MyAgent Foo //assuming Foo has a main() defined
и во время выполнения Foo.class
будет не только выполнять свою нормальную работу, но и будет работать в ядре MyAgent
каждый раз, когда вызывается bar()
.
Для указателя на запись агента с нуля запустите здесь.