1

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有用的一些情况?</p>

PS:我不熟悉java字节码,所以如果我问一些愚蠢的问题,我很抱歉。

4

1 回答 1

2

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

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

于 2018-01-02T23:22:05.317 回答