Что такое инъекция байт-кода Java и почему ее можно использовать?
Что такое Java-байт-код?
Ответ 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()
.
Для указателя на запись агента с нуля запустите здесь.
Ответ 2
Первый поиск в google дает интересное чтение Программирование на Java: Bytecode Injection
Ответ 3
Чтобы решить вторую часть вашего вопроса. Я использую его с тех пор, как я ленив и не хочу, чтобы потратить половину моей (рабочей) жизни на создание геттеров и сеттеров. Вместо этого я добавляю аннотацию @Data до определения моего класса, и все делается.
Смотрите демонстрацию видео в течение 3 минут на Project Lombok.