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/