ASM使用时的注意事项

    这两天写用ASM写了一个将普通JavaBean转成MongoDB的DBObject对象的一个方法,对其中遇到的一些问题做一个总结。

    1.自动装箱功能

      用ASM就意味着很多jdk的很多优化性的功能不能用了,其中之一就是自动装箱和拆箱。如果一个方法接收一个Integer的参数,那你在用ASM调用该方法的时候就不能直接将int传给这个参数,而是要用Integer.valueOf()方法来封装。

    2.关于接口方法的调用

    我们在编写普通java方法时,对于接口方法和对象的方法在调用上来说没有任何区别,但在jvm底层,这两者是有区别的,调用对象的非静态方法用的是INVOKEVIRTUAL指令,而调用接口方法是用的INVOKEINTERFACE指令。这点在使用ASM中应特别注意。

    3.不使用的返回值

    这个问题困扰了我接近一个小时,在我们平时调用时,对于那个方法有返回值,但我们不使用的情况,我们可能从来没有注意过。但你去用javap反编译字节码,会发现如果不使用这个返回值,最后会有一个POP指令将其弹出,这是为了使在方法执行完后,运行栈上为空。如果最后不为空,可能会出现:java.lang.VerifyError:Inconsistent stack height 3 != 2

   还有一些更细节的东西就不写出来,以免被鄙视。(不定期更新。。。)

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值