Что точно действительно ли байт-код Java является инжекцией и почему можно было бы использовать его?
Код Java компилируется в байт-код ( Foo.java - >> Foo.class
). Внедрение байт-кода модифицирует 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
каждый time bar ()
вызывается.
Чтобы узнать о написании агента с нуля, начните с здесь .
Чтобы ответить на вторую часть вашего вопроса. Я использую его, так как я ленив и не хочу тратить половину своей (рабочей) жизни на написание геттеров и сеттеров. Вместо этого я помещаю аннотацию @Data перед определением моего класса, и все готово.
См. Трехминутную демонстрацию видео на Project Lombok .
Первый поиск в Google дает интересное чтение Java Programming: Bytecode Injection