2013-12-20 4 views
1

У меня есть класс шаблона java, из которого я хотел бы изменить одно строковое поле. Я могу создать экземпляр объекта этого класса, перейти к соответствующему объекту класса и изменить поле с использованием отражения, насколько это хорошо. Но как я могу сохранить байт-код в файловой системе?Сохранение байт-кода класса, измененного с отражением

Поскольку я думаю, что если я добираюсь до ClassLoader исходного шаблона класса, добраться до InputStream и попытаться сохранить в файл я получить оригинал (т.е. немодифицированного) реализацию класса. Это так?

В идеале мне также нужно будет изменить название класса на нечто более значимое.

Можно ли сделать все, используя чистую java в первую очередь? Или мне нужно прибегать к внешним библиотекам?

ответ

4

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

В любом случае, AFAIK вы не можете легко получить доступ к байт-коду во время выполнения. JVM создает классы из файлов классов (либо из файлов, либо из данных памяти), но как только класс загружается, нет никаких особых причин для хранения данных. Скорее всего, он сохранит только оптимизированное представление, которое не обязательно соответствует исходному файлу класса.

Я думаю, что есть некоторые API, такие как Java-агент, которые имеют дело с байт-кодом во время выполнения, но неясно, насколько хорошо они работают, отчасти потому, что JVM делает оптимизацию.

0

Найдите пару ассемблера/дизассемблера. Разберите файл класса, замените строковое значение и скомпилируйте его обратно в файл класса. Обратите внимание, что на константу строки можно ссылаться из нескольких точек, поэтому, вероятно, вам нужно добавить константу и изменить только одну ссылку. Если новое строковое значение имеет ту же длину, что и старая (в кодировке UTF-8), вы просто заменяете константу двоичным файловым редактором. Если длина отличается, замена будет уничтожать всю структуру classfile.

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