6

Выполнение манипуляций с байт-кодом с использованием API, например javaassist, изменить файлы классов после компиляции. Но, если java-код оптимизирован, нельзя ли внести изменения в неподходящее место? Есть ли способы избежать этой проблемы? Разве история отличается от обычной Java и Android?Безопасен ли байт-код

+3

Bytecode никогда не оптимизируется, по крайней мере, не в важных целях. –

+0

Я не следую вашему точному значению. Вы имеете в виду, что преобразование из .java в .class javac не требует значительной оптимизации? –

+1

Да, на этом шаге практически не выполняется оптимизация. Это простой перевод. На самом деле попытка оптимизации байт-кода может испортить оптимизацию JIT-компилятора и привести к более медленному коду. –

ответ

2

Типичная программа Java скомпилирована несколько раз. На первом этапе Java исходный код переведен на Java байт код. На втором этапе код байта Java преобразуется в машинный код.

Детали этого процесса, конечно, зависят от виртуальной машины, которая запускает код. Ранние версии Java, например, не включали так называемый компилятор точно в срок. В этом случае байт-код был интерпретирован инструкцией по инструкции, где манипуляции с байтовым кодом могли, конечно, иметь влияние на производительность. Но это уже не так. И виртуальная машина OpenSDT HotSpot, и Android ART и DEX время выполнения выполняет оптимизацию байтового кода.

Компилятор javac, который переводит исходный код в байтовый код, выполняет очень мало оптимизаций. Обычно вам не следует беспокоиться о влиянии на производительность кода на байт-код. Однако в некоторых случаях байт-код, создаваемый генерацией кода времени выполнения, может оказывать влияние на производительность. Это происходит, когда компилятор «точно в момент времени» замечает байтовый код, который трудно оптимизировать. Как правило, это вызвано ненужными выделениями объектов, которые трудно оптимизировать.

Если вы хотите посмотреть в деталях этого вопроса, я дал эту презентацию, где я немного поговорить об этой проблеме: https://www.youtube.com/watch?v=XMY6HA7_h5Y

Что касается безопасности: Пока манипуляция байт-код не развратить байт код, нет проблем. Если это приведет к повреждению байтового кода, виртуальная машина Java откажется от загрузки класса с поврежденным кодом. Это справедливо и для HotSpot и Android, которые проверяют любой байтовый код, предшествующий загрузке класса.