Неясность отражения Java - PullRequest
1 голос
/ 29 марта 2012

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

public static List<Object> getObjectsFromDataBase(Object targetObj) {
....................
ResultSet rs = stat.executeQuery(queryToExecute);
while (rs.next()) {
     Object obj = new Object();
     for (Field property : targetObj.getClass().getFields()) {
      property.set(obj, rs.getString(property.getName()));
     }
     objListToReturn.add(obj);
}
.....................
return objListToReturn;
}

Ответы [ 3 ]

0 голосов
/ 29 марта 2012

Если поля в классе целевого объекта не являются общедоступными, они не будут отображаться в getFields().Попробуйте это:

import java.lang.reflect.Field;

public class Test
{
    public static class A
    {
        public String field1;
        public String field2;
    }
    public static void main(String[] args) throws Exception
    {
        A a = new A();
        Object b = a;
        for (Field f : b.getClass().getFields())
        {
            System.out.println(f.getName());
        }

    }
}

Если вы удалите public, getFields() вернет пустой массив.

0 голосов
/ 29 марта 2012

Я вижу две проблемы:

  1. Вы создаете obj как тип Object.первый аргумент Field.set() должен быть того же типа (или подтипа), что и класс, содержащий поле.Вам нужно использовать отражение, чтобы создать объект того же типа, что и targetObj, используя obj = targetObj.getClass().newInstance() (при условии, что доступен конструктор по умолчанию)

  2. Также ваша проблема может заключаться в том, чтоМетод getFields() возвращает только открытые поля класса.

    targetObj.getClass (). GetFields ()

    Если вы хотите получить все поля класса, вам потребуетсяиспользуйте метод getDeclaredFields ().

0 голосов
/ 29 марта 2012

Короткий ответ - да, это возможно, но не с кодом, который вы предоставили. Эта концепция называется объектно-реляционным отображением, и такие вещи как Hibernate или XStream сделают это за вас. Если вы только изучаете рефлексию, это тоже здорово. Вам, вероятно, понадобится способ сопоставить поля со свойствами объекта, независимо от того, делается ли это с помощью условных обозначений (совпавших имен), прямого кода, аннотаций или входного файла сопоставления.

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