【发布时间】: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