我使用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...
}