Переименование вещей
Как переименовать вещи с помощью BCEL? Итак, что я делаю, так это прохожу каждый метод в классе и создаю новую константу NameAndType в пуле констант, а затем заменяю старую константу NameAndType этой константой.
int nameRef = cpg.addNameAndType(newName, m.getSignature());
cpg.setConstant(m.getNameIndex(), cpg.getConstant(nameRef));
Кажется, что это должно работать, но мой декомпилятор говорит мне, что постоянный пул поврежден после этого. Я пропускаю шаг или что-то?
1 ответ
Вы предполагаете, что ConstantPoolGen
это просто таблица показателей и значений. Но я считаю, что на самом деле у него гораздо более сложная внутренняя структура. Глядя на ConstantPoolGen
метод, ясно, что он также содержит ссылки на MethodGen
объекты, которые могут обновляться или нет, когда вы запускаете свой код.
Я советую вам не манипулировать константным пулом напрямую, а получить каждый метод класса (как MethodGen
объект) и использовать метод setName()
, Постоянный пул будет обновляться автоматически.