Я работаю над небольшим инструментом инструментализации байткода java.
Общая идея заключается в том, чтобы переименовать все методы класса с суффиксом _CONGU
, создавая затем прокси-методы с оригинальными именами методов, которые будут вызывать свои аналоги _CONGU
.
Например, если класс C
содержит метод int m() { return 1; }
, то инструментированный класс C
будет иметь метод int m_CONGU() { return 1; }
и метод int m() { return m_CONGU(); }
.
Позже я добавлю дополнительную логику в int m()
, которая будет выполнять некоторые проверки перед вызовом m_CONGU()
.
В настоящее время я занимаюсь инструментацией всех вызовов конструктора к моему методу с суффиксом _CONGU
.
Ниже показаны инструментированная и неинструментированная версии метода inverse()
класса Fraction
.
При попытке запустить этот код
Fraction fraction = new Fraction(4, 1);
я получаю следующее исключение, которое не дает мне покоя последние пару часов:
Exception in thread "main" java.lang.VerifyError: (class: jorgeTestes/system/fraction/Fraction, метод: inverse_CONGU signature: ()LjorgeTestes/system/fraction/Fraction;) Ожидая найти объект/массив на стеке в jorgeTestes.system.fraction.XyzTest.main(XyzTest.java:9)
Наверное, это очевидная ошибка, но я не могу понять, в чем может быть проблема. Похоже, что это как-то связано с неправильным количеством данных в стеке, но мне кажется, что количество элементов в стеке одинаково и в оригинальном, и в инструментированном коде (по крайней мере, так должно быть). Есть идеи?
1) вот дескрипторы обоих
и Fraction_CONGU
(которые одинаковы, как и следовало ожидать!):
2) Мне интересно, может ли цвет [0] Code
быть другим в Bytecode Viewer означать, что есть какая-то другая проблема с моим инструментированным кодом? Может быть, есть какие-то метаданные, которые нарушаются в процессе, и это может быть причиной того, что код выглядит нормально, но при попытке запустить код все равно возникает проблема?