【问题标题】:aload_2 seems to be pointing to the first argumentaload_2 似乎指向第一个参数
【发布时间】:2014-05-27 09:30:46
【问题描述】:

我使用javap 来反汇编一些java 字节码,因为在使用jd-gui 对其进行反编译后,我遇到了一些方法错误。但是,将反汇编的字节码与 jd-gui 给我的进行比较,看起来 aload_2 指向的是第一个参数,而不是 aload_1。

有问题的方法是公共的、非静态的、无效的、可能是同步的方法。 (我相信该方法可能是同步的,这就是 jd-gui 遇到问题的原因。)无论如何,该方法需要 6 个参数(int、long、String、String、String、String),并且这些变量被赋予jd-gui的以下名称:

int paramInt, long paramLong, String paramString1, String paramString2, String paramString3, String paramString4

现在,当我说第一个参数似乎是 aload_2 时,为了向您展示我的意思,让我发布部分反汇编和反编译的代码。

反编译:

Object localObject1;
if (paramString2.equals("DELETE"))
{
    localObject1 = new HttpDelete(paramString1);
}

拆解:

11: aload         5
13: ldc           #214                // String DELETE
15: invokevirtual #219                // Method java/lang/String.equals:(Ljava/lang/Object;)Z
18: ifeq          192
21: new           #221                // class org/apache/http/client/methods/HttpDelete
24: dup           
25: aload         4
27: invokespecial #223                // Method org/apache/http/client/methods/HttpDelete."<init>":(Ljava/lang/String;)V
30: astore        8

在反汇编代码中,第 11 到 18 行与反编译代码中的 if(paramString2.equals("DELETE")) 行相同。注意 aload 5 如何指向第四个参数(paramString2)。这不是我所期望的。通常 aload_0 = this,aload_1 = 第一个参数,aload_2 = 第二个参数,依此类推。

您会认为 aload 5 指向第 5 个参数,但 jd-gui 将其解释为指向第 4 个参数。为什么?该方法可能同步的事实与此有关吗?

对于任何可能需要的澄清,我会将反汇编的字节码解释为:

if(paramString3.equals("DELETE"))
{
    HttpDelete httpDelete = new HttpDelete(paramString2);
    //More code on down here...
}

【问题讨论】:

  • 参数的编号只是一个约定。你能发布更多的字节码吗?
  • 这里是整个方法:pastebin.com/KiWG5VHX
  • 可能同步?要么同步,要么不同步。另外,为了将来参考,Krakatau 通常可以在 jd-gui 等其他反编译器失败的地方反编译代码。

标签: java jvm bytecode synchronized


【解决方案1】:

因为long参数会占用一对局部变量JVMS 2.6.1

【讨论】:

  • 好多了,并且很好地解释了正在发生的事情。 +1。
猜你喜欢
  • 2016-11-28
  • 1970-01-01
  • 2017-06-11
  • 2018-04-23
  • 1970-01-01
  • 1970-01-01
  • 2020-04-19
  • 2020-08-25
  • 1970-01-01
相关资源
最近更新 更多