Вызов локального метода посредника инструмента в теле метода

Я знаю (по крайней мере, используя, например, BCEL или ASM), можно каким-то образом получить доступ к локальным переменным метода... но мне нужно нечто большее, что я хотел бы:

  1. получить тип такой переменной (или способ конвертации из подписи)
  2. знать (различать), когда эта переменная используется (либо видит, что ее значение затронуто, либо передается как параметр)
  3. когда эта переменная используется в качестве параметра, чтобы узнать, к какому вызову метода она была передана
  4. разбить "цепочки методов" в их соответствующих вызовах методов и получить их возвращаемое значение, чтобы я мог ими манипулировать

Основная идея заключается в том, что я хотел бы немного "инструментировать" методы так же, как это делает отладчик (хотя и ограниченный глубиной первого кадра...).

Любой указатель оценен. Если вам нужна дополнительная информация, не стесняйтесь спрашивать.

1 ответ

Это возможно только при использовании API уровня байтового кода. cglib не предоставляет такой API, чтобы вам приходилось выбирать между ASM, BCEL и Javassist, где я бы порекомендовал вам ASM с лучшей документацией.

Что вам нужно будет сделать:

  1. Разбор подписи метода, ASM предлагает утилиты для этого. Вы получите любой тип по его внутреннему имени. Вам нужно будет сопоставить эти имена с их индексом.
  2. Найти любое использование переменной, которая используется из этого индекса.

Это, однако, довольно сложная задача. Чтобы предсказать ваш код, вы должны эмулировать вызов метода. JVM является машиной стека, аргументы могут быть помещены в стек операнда в результате произвольной цепочки команд. Следовательно, вам фактически придется интерпретировать любую найденную инструкцию байт-кода. Вам, более или менее, нужно будет написать свой собственный упрощенный интерпретатор, что является довольно сложной задачей.

Другие вопросы по тегам