Я использую ASM4 для некоторых манипуляций с байт-кодом Java. Я хочу скопировать код из одного метода в другой. Последний имеет некоторый дополнительный код, и из-за этого каждый LabelNode
из первого метода должен быть переназначен.Редактирование этикеток с ASM4
Проблема возникает, когда необходимо вставить локальные переменные. Я следовал этому шаблону: получить локальные переменные из первого метода, создать его копию с индексом и начальным ярлыком, а конечные метки узлов изменены. Посетитель используется для получения локальных переменного имеет такой вид:
public void visitLocalVariable(String name, String desc, String signature, Label start, Label end, int index)
и код, который необходимо вставить новый переменный вид локальный так:
localVariableList.add(new LocalVariableNode((String name, String desc, String signature, LabelNode start, LabelNode end, int index)))
Проблемы есть, info
поля от Label
объекта является null, поэтому я не могу получить ссылку на старый LabelNode
, чтобы я мог переназначить свои новые узлы.
Я также пытался получить смещение от кода с label.getOffset()
и затем переназначить смещение в список смещений, связанных с моим новым списком LabelNode
, но я получаю исключение:
java.lang.IllegalStateException: Label offset position has not been resolved yet
at org.objectweb.asm.Label.getOffset(Unknown Source)
Если какой-либо из вас имеет представление о том, как я могу получить соответствующий LabelNode
от Label
, будет очень признателен. Или, может быть, есть лучший подход при копировании кода из одного метода в другой и разрешении проблемы с метками, lablenode и localvariables.
Большую часть времени я использую API дерева из-за его простоты.
Благодарим за помощь.
Если вы копируете один 'InsnList' в другой, вы можете использовать' resetLabels() ', чтобы смещения метки и позиции правильно перестраивались. – Vulcan