aload_2似乎指向第一个参数

时间:2014-05-27 01:18:13

标签: java jvm bytecode synchronized

我使用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如何指向第4个参数(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...
}

1 个答案:

答案 0 :(得分:3)

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