Java ASM字节码-查找属于特定方法调用的所有指令

问题描述 投票:1回答:1

Hi。我想找到方法调用的startend之间的指令范围。我不想只是更改方法调用所有者/名称/描述。有了预期的结果,我希望能够做到:

  1. 完全删除方法调用
  2. 通过在前面或后面添加新参数来修改方法调用

我一直在尝试不同的技术来实现这一目标:

  1. ASM分析器(使用SourceInterpreter)
  2. 通过对指令计数或计数堆栈高度进行计数来循环查找正向和反向的指令集,以尝试找到startend,>
  3. 通过StackOverflow搜索(没有发现导致预期行为的内容)
  4. 如果有任何混淆,我将给您一些我想要的例子。首先,请看下面我的测试代码,然后回到这里。我希望查找/删除对anotherMethod4的整个方法调用,并用简单的true替换它,得到以下代码:

    System.out.println(
        anotherMethod1(
            anotherMethod2("a", "b") ?
                "c" : anotherMethod3("d", "e") ? "f" : "g",
                true ? "j" : "k"
        ) ? "l" : "m"
    );

我希望找到/删除对anotherMethod1的整个方法调用,并将其替换为简单的false,从而得到以下代码:

    System.out.println(
        false ? "l" : "m"
    );

我希望删除对System.out.println的整个方法调用,得到以下代码:

    private Main()
    {

    }

这肯定有可能吗?这是我当前的测试代码:

private Main()
{
    System.out.println(
        anotherMethod1(
            anotherMethod2("a", "b") ?
                "c" : anotherMethod3("d", "e") ? "f" : "g",
                anotherMethod4("h", "i") ? "j" : "k"
        ) ? "l" : "m"
    );
}

boolean anotherMethod1(String str, String oof)
{
    return true;
}
boolean anotherMethod2(String str, String oof)
{
    return true;
}
boolean anotherMethod3(String str, String oof)
{
    return true;
}
boolean anotherMethod4(String str, String oof)
{
    return true;
}

嗨。我想找到方法调用的开始和结束之间的指令范围。我不想只是更改方法调用所有者/名称/描述。有了预期的结果,我想...

java bytecode java-bytecode-asm
1个回答
0
投票

方法调用的参数可能会产生副作用,例如method(variable = value),甚至可能无法消除,例如在删除调用之后,何时将导致访问未初始化的变量。在字节码级别,属于自变量求值的指令可以与任意不相关的指令交错。

© www.soinside.com 2019 - 2024. All rights reserved.