Удаление инструкций из байт-кода Java

Я использовал Javassist для динамического управления классами по мере их загрузки. Хотя добавить код в метод с помощью Javassist относительно легко, мне не удалось найти способ удалить код .

В настоящее время я моделирую удаление кода, используя инструкции nop для замены целевых кодов операций и любых параметров. Однако я считаю, что это в основном хакерство:

  • Каждый код операции нужно обрабатывать отдельно, поскольку длина параметров в байтах различается. В некоторых случаях мне также нужно выбирать между nop и pop , в зависимости от того, влияет ли удаленный код операции на стек или нет. Подобные манипуляции становятся утомительными - и код, который их выполняет, становится соответственно запутанным. Так что, естественно, я надеюсь на уже существующее решение.

  • Окончательный результат заполняется инструкциями nop . Хотя JVM должна оптимизировать их, не влияя на производительность, полученный байт-код все еще довольно неэлегантен и больше, чем должен быть. Это скорее вопрос эстетики, но все же это необходимо учитывать.

К сожалению, просто сдвинуть части массива байт-кода, чтобы закрыть пробел, недостаточно - любые ссылки на перемещенный код (например, индексы инструкций перехода) также должны быть обновлены.

Можно ли удалить инструкции с помощью Javassist? В качестве альтернативы, существует ли библиотека для манипуляции с байт-кодом, которая позволила бы мне сделать это легко, без необходимости самостоятельно анализировать байт-код?

11
задан thkala 10 February 2012 в 13:12
поделиться