为什么在CgLib BeanCopier

时间:2018-01-02 17:58:37

标签: java jvm java-bytecode-asm cglib jvm-bytecode

cglib的BeanCopier使用net.sf.cglib.beans.BeanCopier.Generator#generateClass方法根据您提供的clazz获取特定的BeanCopier。但是在BeanCopier.java的第152行,我认为有一个无用的dup2。我创建了自己的BeanCopier只删除了第152行,其余部分与CGLIB BeanCopier.java相同,我的复印机仍在工作,没有任何异常或错误。 Cglib BeanCopier.java生成了字节码

public void copy(java.lang.Object, java.lang.Object, net.sf.cglib.core.Converter);
    Code:
       0: aload_2
       1: checkcast     #13                 // class study/copierTest/B
       4: aload_1
       5: checkcast     #15                 // class study/copierTest/A
       8: dup2
       9: invokevirtual #19                 // Method study/copierTest/A.getA:()Ljava/lang/String;
      12: invokevirtual #23                 // Method study/copierTest/B.setA:(Ljava/lang/String;)V
      15: return

Mine Copier没有dup2,仍在工作。

所以,我的问题是:dup2真的没用,或者我错过了dup2有用的一些情况吗?

PS:我不熟悉java字节码,所以如果我问傻话,我很抱歉。

1 个答案:

答案 0 :(得分:2)

这只是一个有根据的猜测,但代码生成器很可能支持任意数量的属性,因此dup2确保两个bean引用保留在堆栈中以用于下一个属性。

在这种情况下,代码生成器为每个属性生成dup2指令。对于 last 属性(在您的情况下是 only 属性),可以省略它,但是在处理属性描述符和生成时需要对最后一个元素进行特殊处理代码,只是为了在结果类文件中保存一个字节。所以没有进行这种优化。