欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

ASM使用时的注意事项

程序员文章站 2022-05-23 11:42:17
...

    这两天写用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

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

相关标签: java jvm asm