Переименование вещей

Как переименовать вещи с помощью BCEL? Итак, что я делаю, так это прохожу каждый метод в классе и создаю новую константу NameAndType в пуле констант, а затем заменяю старую константу NameAndType этой константой.

int nameRef = cpg.addNameAndType(newName, m.getSignature());
cpg.setConstant(m.getNameIndex(), cpg.getConstant(nameRef));

Кажется, что это должно работать, но мой декомпилятор говорит мне, что постоянный пул поврежден после этого. Я пропускаю шаг или что-то?

1 ответ

Решение

Вы предполагаете, что ConstantPoolGen это просто таблица показателей и значений. Но я считаю, что на самом деле у него гораздо более сложная внутренняя структура. Глядя на ConstantPoolGen метод, ясно, что он также содержит ссылки на MethodGen объекты, которые могут обновляться или нет, когда вы запускаете свой код.

Я советую вам не манипулировать константным пулом напрямую, а получить каждый метод класса (как MethodGen объект) и использовать метод setName(), Постоянный пул будет обновляться автоматически.

Другие вопросы по тегам