Я использую ASM и хочу переписать что-то вроде:
someMethod().targetMethod(args...)
в
someMethod().injectedMethod(arg).targetMethod(args...)
Проблема в том, что я не знаю, что такое метод раньше, я знаю только целевой метод (поэтому поиск someMethod()
и инъекция после этого не является вариантом).
У меня также есть много вариантов целевого метода с разными наборами параметров, с которыми я хочу работать.
Используя ASM, я могу легко найти вызов целевого метода, но, к сожалению, стек операндов в этой точке:
[ argN, ..., arg1, instance, ... ]
И пока я могу разобраться, насколько далеко будет присутствовать экземпляр, нет байт-кода, который я могу ввести, который его прочитает. Я знаю, что вы можете сделать это до 4 параметров с помощью трюков с помощью команд dup, но мне нужно общее решение.
Я мог бы добавить кучу локальных переменных и скопировать все из стека, дублировать указанный экземпляр и снова положить все, но что неэффективность во время выполнения я действительно не хочу.
То, что я думаю, будет работать, если бы я мог отслеживать, какая команда отвечала за то, чтобы поместить указатель экземпляра в стек, а затем я мог бы вставлять туда свой метод, а не в вызов целевого метода. Однако мне не повезло найти что-нибудь, чтобы помочь мне сделать это.
Я знаю, что такие вещи, как AspectJ, позволяют это, но должны делать это для множества классов при загрузке, а AspectJ просто слишком медленный.
Может ли кто-нибудь указать мне на инструменты анализа, построенные поверх ASM, которые могут позволить мне сделать это, или кто-нибудь может подумать о более эффективном подходе к инъекции одного вызова метода перед другим?