Java反射不明确

时间:2012-03-29 19:37:20

标签: java reflection

我试图通过反射基于目标对象从数据库中获取对象列表。 我没有太多的反思经验,所以这不起作用。 是否有可能实现我的目标?

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 :(得分:0)

简短的回答是肯定的,这是可能的,但不是你提供的代码。这个概念称为对象关系映射,HibernateXStream之类的东西为您执行此操作。如果你只是学习反思也很棒。您可能需要一种方法将字段映射到对象的属性,无论是使用约定(匹配名称),直接代码,注释还是映射输入文件都由您决定。

答案 1 :(得分:0)

如果目标对象类中的字段不公开,则它们不会显示在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());
        }

    }
}

如果删除publicgetFields()将返回一个空数组。

答案 2 :(得分:0)

我可以看到两个问题:

  1. 您正在创建obj作为Object类型。 Field.set()的第一个参数需要与包含该字段的类相同(或子类型)。您需要使用反射来创建与targetObj相同类型的对象,方法是使用obj = targetObj.getClass().newInstance()(假设默认构造函数可用)

  2. 此外,您的问题可能是getFields()方法仅返回该类的公共字段。

    targetObj.getClass()。getFields()

    如果要获取该类的所有字段,则需要使用getDeclaredFields()方法。