2015-10-16 1 views
0

Я искал, как скопировать данные объекта суперкласса в подкласс.BeanUtils.copyProperties (подкласс, суперкласс) возвращает null для значений поля подкласса

Обнаружена эта нить How to copy superclass object values to subclass object values?, которая ссылается на другую тему, которая говорит использовать BeanUtils.copyProperties.

Я использовал приведенный выше код

BeanUtils.copyProperties(subclass,superclass); 

, но когда я пытаюсь напечатать значения из подкласса, я получаю нуль для значений

 this.face = new FaceData[faces]; 
     this.f = new FaceSubData[faces]; 

     for(int i = 0; i < faces; i++) 
     {      


      this.face = //somevalue 
      this.f[i] = new FaceSubData(); 
      try 
      { 
       BeanUtils.copyProperties(f[i], face[i]); 
       System.out.println(f[i].x); 
      } 
      catch (IllegalAccessException | InvocationTargetException ex) 
      { 
       Logger.getLogger(PlanHead.class.getName()).log(Level.SEVERE, null, ex); 
      } 

если я печатаю е [я] .x I get null, но если я сталкиваюсь с [i] .x, я получаю все значения.

В основном подкласс получает все значения из суперкласса и добавляет несколько дополнительных бит данных, с которыми мне нужно работать.

Я делаю что-то неправильно ...?

Кроме того, в цикле есть точка, если последнее и текущее значение массива совпадают, тогда мне нужно только скопировать свойства из предыдущего подкласса в текущий подкласс. Мне любопытно, если это будет скопировать все свойства или только некоторые из самого подкласса? Я бы все взял, но из вопроса сейчас я не уверен ...

Спасибо.

+0

Но зачем вам нужны специальные методы для копирования значений суперкласса для значений объекта подкласса? Они автоматически наследуются подклассом, если не объявлены частными. – SacJn

+0

Как скопированы значения? Приведите пример, пожалуйста. – XaolingBao

ответ

2

Как вы заявляете в своем демо-коде, вы получаете доступ к свойствам, недоступным для доступа, а BeanUtils не имеет доступа к свойствам, а вместо этого к ним. Если у вас нет геттеров/сеттеров для ваших свойств, обязательно BeanUtils не копирует ничего.

С другой стороны, я хотел бы посоветовать вам, что Javadoc из BeanUtils.copyProperties (хорошо это один указывает на BeanUtilsBean.copyProperties) говорится следующее:

Если вы знаете, что никакие преобразования типов не требуется, Метод copyProperties() в PropertyUtils будет выполняться быстрее, чем этот метод.

Так как вы копируете из суперкласса в подкласс, я думаю, что нет преобразования типа, поэтому передумайте с помощью PropertyUtils.copyProperties.

+0

Не совсем уверен, что такое «Аксессор», но вы говорите об этом, например, getter/setter? Я бы предположил, что он копирует значения полей ??? Преобразования типов будут похожи на Float на Integer или что-то еще? Спасибо за советы. – XaolingBao

+1

Аксессоры также известны как геттеры и мутаторы как сеттеры. BeanUtils делает тип конверсии, как вы заявляли. BeanUtils не копирует значения поля, вместо этого использует аксессоры. Попробуйте добавить аксессуаров и адаптировать свой код. – malaguna

+0

Спасибо, должны ли у меня настройки или просто геттеры? Спасибо за советы :) – XaolingBao