2016-02-20 2 views
0

Учитывая массив byte[] для .class файл: можно ли переименовать все ссылки на классы для данного класса внутри байт-кода? (Например, от test.class ->test_new_version.class включая все конструкторы или любые другие ссылки на байт-коды). Если да, то для чего это хорошая библиотека?Переименование класса Java в представлении Bytecode

+2

вы можете сделать это, используя библиотеку ASM. –

+0

Теоретически возможно создать класс, который нельзя переименовать из-за ограничений класса. Но это то, чего вы никогда не увидите на практике. ASM, вероятно, самая популярная библиотека для этого. – Antimony

+1

@Peter Lawrey: на самом деле ASM очень плохо для этой работы. Переименование ссылки класса с использованием ASM подразумевает перемещение всех полей, методов, аннотаций и т. Д. И повторение операции замены для каждого артефакта байт-кода, относящегося к классу, тогда как обычно есть только одна ссылка на имя и одно вхождение на каждую отдельную подпись, которая должна быть заменена в постоянном пуле который можно обработать, не глядя на остальную часть класса. – Holger

ответ

0

Это возможно, используя библиотеку ASM. FAQ для этой библиотеки даже дает example for how to rename a class in its tutorial.

Фактически, вам необходимо использовать RemappingClassAdapter, который поставляется с утилитами библиотеки. Чтобы сгенерировать законный байтовый код, переименованный класс должен быть полностью бинарным, совместимым с замененным классом.

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