ASM字节码覆盖方法的范围接近方法

时间:2018-10-12 18:03:08

标签: java jvm java-bytecode-asm bytecode-manipulation

我不能只替换整个方法。我必须在上次正常设置本地变量之后但在方法结束之前使用它之前,对本地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 */

1 个答案:

答案 0 :(得分:0)

虽然您可以访问方法中的说明以找到设置的最后位置,然后再次传递代码以注入更改,但是最简单的方法是翻译代码,以便每次设置变量时,您将其设置为所需的值。甚至可能不需要更多代码,只需替换其中的代码即可。