java a >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."":(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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值