Как стать автором
Обновить

Комментарии 8

Подписался на продолжение!

Ответ очевиден – приложение не может само себя изменять.

По мне так не очевиден. Приложение очевидно может сгенерировать байткода, загрузить его класслоадером, и вызвать полученные классы. И чем это не изменение самого себя? А тот же javaagent — это отдельное приложение, или часть того же самого приложения? А если он в том же самом jar, что и основная часть (или вы считаете, что так нельзя)? Не то чтобы это была претензия по сути, скорее — нужно четче определить что вы тут называете приложением. По мне, так та часть, что изменяет байткод, должна (ну как правило) знать, что за код она изменяет. И их вполне можно считать частью одного приложения. Как скажем, ядро и plugins.

Я вот тоже не понял этот момент, читал на ходу. Ломбок вот вроде отлично справляется с изменением байткода моего приложения.

Ломбок редактирует не байткод.

Он работает на уровне сурсов (если точнее, то AST), используя внутренние API javac/ecj (публичное API не даёт редактировать дерево существующих сурсов, а только позволяет создавать новые).

Ответ очевиден – приложение не может само себя изменять. Т.е. приложение не может само изменять свой же байткод.
Во времена былинные можно было писать и self-modifying байткод. Сейчас да, только через подгрузку классов.

К сожалению, в статье нет хорошего конкретного обоснования, зачем это нужно.

Предположим, вы нашли баг в библиотеке

Если в какой-то библиотеке баг, то надо не преобразовывать байткод, а исправлять эту ошибку в библиотеке.

А как можно использовать Javassist, в интернетах информации пруд пруди.

>Если в какой-то библиотеке баг, то надо не преобразовывать байткод, а исправлять эту ошибку в библиотеке.
Ну, иногда проще так. По сути, модификация байткода или исходников (с пересборкой) — результат-то один, а вот затраты труда могут быть очень разными.
if ("com.company.Main".equals(className.replaceAll("/", "."))) {
  ...
}
return byteCode;

Автор, читайте внимательнее документацию, чтобы не нагружать приложение ненужной работой.

Returns:

a well-formed class file buffer (the result of the transform), or nullif no transform is performed.

Зарегистрируйтесь на Хабре, чтобы оставить комментарий

Публикации

Истории