Почему в CgLib BeanCopier есть бесполезный (на мой взгляд) dup2
BeanCopier в cglib использует метод net.sf.cglib.beans.BeanCopier.Generator#generateClass, чтобы получить конкретный BeanCopier в соответствии с предложенным вами предложением. но в строке 152 файла BeanCopier.java есть бесполезный 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, так что извините, если я спрошу что-то глупое.
1 ответ
Это только обоснованное предположение, но вполне вероятно, что генератор кода поддерживает произвольное количество свойств, поэтому dup2
гарантирует, что две ссылки на компоненты остаются в стеке для следующего свойства.
В этом случае генератор кода генерирует dup2
инструкция для каждого свойства. Это может быть опущено для последнего свойства (которое является единственным свойством в вашем случае), но это потребует особой обработки последнего элемента при обработке дескрипторов свойств и генерации кода, чтобы сохранить только один байт в результирующем файл класса. Так что эта оптимизация не была сделана.