我不能只替换整个方法。我必须在上次正常设置本地变量之后但在方法结束之前使用它之前,对本地var进行重新分配。
这是一些伪代码
void test() {
/* stuff */
String thing = null;
if (case1) {
thing = "case1"
}
if (case2) {
thing = "case2"
}
if (case3) {
thing = "case3"
}
if (thing == null) {
thing = "default";
}
/* I want to insert this code below with ASM */
thing = "Injected by ASM";
/* stuff */
}
当代码到达检查thing == null
是否到达该点时,我也可以替换默认分配。但是默认分配的字节码是一个很长的StringBuilder
,带有很多追加。我可以使用一个LDC来唯一标识该行,但是我不知道如何替换该行的整个thing
分配。我只知道如何更换LDC(这还不够)。
我的想法是我想忽略所有case1-3
,以使thing
始终是我告诉ASM将其设置为
但是无法删除方法顶部和底部的/* stuff */
答案 0 :(得分:0)
虽然您可以访问方法中的说明以找到设置的最后位置,然后再次传递代码以注入更改,但是最简单的方法是翻译代码,以便每次设置变量时,您将其设置为所需的值。甚至可能不需要更多代码,只需替换其中的代码即可。