ASM使用时的注意事项
程序员文章站
2022-05-23 11:41:53
...
这两天写用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
还有一些更细节的东西就不写出来,以免被鄙视。(不定期更新。。。)