为什么在CgLib BeanCopier中有一个无用的(在我看来)dup2

问题描述 投票:1回答: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有用的一些情况?

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

java jvm java-bytecode-asm cglib jvm-bytecode
1个回答
2
投票

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

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

© www.soinside.com 2019 - 2024. All rights reserved.