Метод переопределения байтового кода ASM находится в области видимости, близкой к концу метода - PullRequest
0 голосов
/ 12 октября 2018

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

Вот некоторый псевдокод

void test() {
/* stuff */

String thing = null;

if (case1) {
  thing = "case1"
}

if (case2) {
  thing = "case2"
}

if (case3) {
  thing = "case3"
}

if (thing == null) {
  thing = "default";
}

/* I want to insert this code below with ASM */
thing = "Injected by ASM";

/* stuff */
}

Iможет также просто заменить присвоение по умолчанию, когда код достигает той точки, где он проверяет, если thing == null.Но байт-код для назначения по умолчанию довольно длинный StringBuilder с большим количеством добавлений.Есть LDC, который я могу использовать, чтобы однозначно идентифицировать это, но в строке я не знаю, как заменить все назначение thing для этой строки.Я знаю только, как заменить LDC (чего недостаточно).

Идея в том, что я хочу игнорировать все case1-3, чтобы thing всегда было тем, что я говорю ASM, чтобы установить его как

Но /* stuff */ вверху и внизу метода нельзя удалить

1 Ответ

0 голосов
/ 12 октября 2018

В то время как вы могли бы посетить инструкции в методе, чтобы найти последнее место, в котором он установлен, и затем снова передать код, чтобы ввести изменение, самый простой подход состоит в том, чтобы перевести код так, чтобы каждый раз, когда переменная была установлена,Вы устанавливаете это значение, которое вы хотите.Для этого может даже не потребоваться больше кода, просто замените то, что там есть.

...