Java Reflect 2 объекта - PullRequest
       19

Java Reflect 2 объекта

1 голос
/ 23 декабря 2009

Привет, я получил код ниже:

ModuleA.Student student 1 = null;
ModuleB.Student student 2 = null;

student2 = retrieveStudentFacade().findStudentbyName("John");
student1 = StudentSessionEJBBean.convert(student2,ModuleA.Student.Class);

Проблема сейчас student1.getId (); вернуть ноль, но должен вернуть мне значение. Ниже приведен метод преобразования, кто-то подсказывает мне, как использовать этот метод для отражения объектов. Это хорошо работает, так как никаких ошибок не возникает, просто не возвращается значение?

UPDATE

   public static <A,B> B convert(A instance, Class<B> targetClass) throws Exception {
B target = (B) targetClass.newInstance();
for (Field targetField: targetClass.getDeclaredFields()) {
    Field field = instance.getClass().getDeclaredField(targetField.getName());
    field.setAccessible(true);
    targetField.set(target, field.get(instance));
}
return target;
}

Ответы [ 4 ]

2 голосов
/ 23 декабря 2009

Действительно, действительно, действительно, вы не хотите этого делать! Ну, вы можете захотеть сделать это ... но вы действительно не должны этого делать.

Вместо использования отражения используйте язык и предоставьте конструктор, подобный этому:

package ModuleA;  // should be all lower case by convention...

public class Student
{
    // pick differnt names for them is a good idea... 2 classes called Student is asking for trouble
    public Student(final ModualB.Student other)
    {
        // do the copying here like xxx =  other.getXXX();
    }
}

Что нужно исправить в вашем коде:

  • не объявляйте, что метод «выбрасывает исключение», так как вам необходимо иметь «catch (Exception ex)», и это может заставить вас скрывать ошибки в вашем коде.

  • (догадываясь), по крайней мере, в блоке catch выполните ex.printStackTrace () (или зарегистрируйте его), чтобы увидеть, что-то пошло не так.

1 голос
/ 23 декабря 2009

Причины того, что вы пытаетесь сделать, были бы странными (поделиться ими), но есть более подходящие подходы, чем использование отражения вручную.

  1. Apache commons-beanutils BeanUtils.copyProperties (источник, цель)
  2. Spring's BeanUtils.copyProperties (источник, цель)

Но вам понадобятся публичные установщики / получатели для свойств, которые вы хотите скопировать (и вы должны их иметь в любом случае), и вам придется заранее создать экземпляр целевого объекта.

1 голос
/ 23 декабря 2009

Вы уверены, что не глотаете какие-либо исключения ??

Я предлагаю вам использовать методы setter / getter вместо прямого доступа к полям. Вы можете извлекать методы аналогично полям, а затем вызывать их для объектов.

Хотя код становится сложным, вы должны быть в состоянии достичь того, что вы хотите.

Инструменты, такие как утилиты копирования bean-компонентов, также используют getter / setter (поэтому они работают только с "bean-компонентами", которые имеют getter / setters, которые соответствуют соглашениям о присвоении имен).

0 голосов
/ 23 декабря 2009

Метод getFields возвращает только общедоступные поля (т.е. не частные, защищенные или доступные для пакетов. Из JavaDoc:

Возвращает массив, содержащий Field объектов, отражающих все доступные открытые поля класса или интерфейса

Я предполагаю, что поле id, которое вас интересует, является закрытым, поэтому вам следует вместо этого использовать метод getDeclaredFields.

Возвращает массив объектов Field, отражающих все поля, объявленные классом или интерфейсом, представленным этим объектом Class. Сюда входят открытые, защищенные, доступ по умолчанию (пакет) и закрытые поля, но исключаются унаследованные поля.

Чтобы рефлексивно установить (приватные) поля, возвращаемые этим методом, вам также необходимо вызвать field.setAccessible (true).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...