编程语言
首页 > 编程语言> > java-aload_2似乎指向第一个参数

java-aload_2似乎指向第一个参数

作者:互联网

我使用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 =此,aload_1 =第一个参数,aload_2 =第二个参数,依此类推.

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

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

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

解决方法:

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

标签:jvm,synchronized,java,bytecode
来源: https://codeday.me/bug/20191121/2053694.html