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

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

cglib的BeanCopier根据你给出的clazz,使用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

Mine Copier 只是没有 dup2 并且仍在工作。

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

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

最佳答案

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

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

关于java - 为什么CgLib BeanCopier中有一个无用的(在我看来)dup2,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48065638/

相关文章:

java - 如何避免此 java 代码的额外输出

java - 在Android中,如何在尊重fling加速的同时实现listview的snap效果?

JavaFX 预加载器和 Netbeans

java - 程序终止时如何关闭端口?

java - 如何使用 ASM 更改静态变量值?

java - RegExp 匹配由有限字符集形成的字符串而不重复使用任何字符

java - 简单的 Swing 程序即使在空闲时也使用 ~200MB?

spring-boot - JVM 在验证 pub/sub 时崩溃

java - 使用 ASM 获取方法参数

Java asm编译器