Почему в 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 инструкция для каждого свойства. Это может быть опущено для последнего свойства (которое является единственным свойством в вашем случае), но это потребует особой обработки последнего элемента при обработке дескрипторов свойств и генерации кода, чтобы сохранить только один байт в результирующем файл класса. Так что эта оптимизация не была сделана.

Другие вопросы по тегам