使用ASM,如何将方法准确地注入到我想要的位置?
示例:
public void exampleMethod() {
doOneThing();
doSomeMoreStuff();
if (someCondition) {
doEvenMoreThings();
}
callMyInjectedMethodHere(); // This call has been injected
if (someOtherCondition) {
doRandomStuff();
}
doStuff();
}
ASM有一个访问者和一个树API,它允许您逐个指令处理方法的字节码指令。您需要做的是访问所有指令,在您的情况下是两个方法调用、一个分支指令、一个方法调用和上一个分支的目标标签,然后发送一个额外的方法调用指令。通过这种方式,您可以修改方法。
然而,请注意,方法体的变化通常比签名更快,而且这种注射往往非常脆弱。如果你能避开它,就避开它。