cglib的BeanCopier使用net.sf.cglib.beans.BeanCopier.Generator#generateClass方法根据您给出的提示来获取特定的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


我的复印机只是没有dup2而仍在工作。

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

PS:我对Java字节码不熟悉,所以如果我问些愚蠢的事情,我感到抱歉。

最佳答案

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

在这种情况下,代码生成器为每个属性生成dup2指令。可以省略las​​t属性(这是您的情况下唯一的属性),但是在处理属性描述符和生成代码时,需要对last元素进行特殊处理,以便仅在结果中节省一个字节类文件。因此未进行此优化。

07-24 09:36