2010-12-12 6 views
2

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

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

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

ответ

1

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

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

+0

Спасибо :) Теперь мне просто нужно выяснить способ обновления всех ссылок на методы в других классах. – Contra

+0

Вы можете пройти через каждое заявление invoke и изменить его имя метода. Скорее всего, новый метод будет добавлен в Constant Pool. Однако вам может потребоваться вручную очистить CP, чтобы удалить старое имя метода. –

Смежные вопросы