Я использовал Javassist для динамического управления классами по мере их загрузки. При добавлении кода к методу относительно просто с помощью Javassist, я не смог найти способ до удалить код.Извлечение инструкций из байт-кода Java
В это время я имитирую удаление кода с помощью nop инструкций для замены целевых кодов операций и любых параметров. Тем не менее, я считаю, что это в основном хака:
Каждый опкод должен рассматриваться отдельно, так как длина байта параметров отличается. В некоторых случаях мне также нужно выбирать между nop и pop, в зависимости от того, влияет ли удаленный код операции на стек или нет. Такая манипуляция начинает утомиться - и код, который делает это, становится изначально запутанным. Поэтому, естественно, я надеюсь на существующее решение.
Окончательный результат заполняется nop. В то время как JVM должен оптимизировать их без какого-либо влияния на производительность, полученный байт-код по-прежнему довольно неэлегантен и больше, чем он должен быть. Это скорее проблема эстетики, но это все еще нужно рассмотреть.
К сожалению, только движущиеся части массива байт-код, чтобы закрыть разрыв не хватает - все ссылки на перемещаемого кода (например, команда ветвления индексов) должны быть обновлены, а также.
Можно ли удалить инструкции с помощью Javassist? В качестве альтернативы, есть ли библиотека манипуляции байт-кодами, которая позволила бы мне сделать это легко, без необходимости разбирать сам байт-код?
Мне просто интересно. почему ты хочешь сделать это? Не было бы проще декомпилировать классы, изменить их и скомпилировать снова? – Luixv
@Luixv: Я хочу, чтобы процесс манипуляции выполнялся автоматически во время выполнения - изменение исходного кода вручную не является вариантом, потому что преобразования не исправлены. – thkala
Если вы поместите класс в 'jar', избыточный' nop' будет достаточно сжат, а сжатый размер будет не намного больше. –