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
指令。可以省略last属性(这是您的情况下唯一的属性),但是在处理属性描述符和生成代码时,需要对last元素进行特殊处理,以便仅在结果中节省一个字节类文件。因此未进行此优化。