我试图通过反射基于目标对象从数据库中获取对象列表。 我没有太多的反思经验,所以这不起作用。 是否有可能实现我的目标?
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;
}
答案 0 :(得分:0)
简短的回答是肯定的,这是可能的,但不是你提供的代码。这个概念称为对象关系映射,Hibernate或XStream之类的东西为您执行此操作。如果你只是学习反思也很棒。您可能需要一种方法将字段映射到对象的属性,无论是使用约定(匹配名称),直接代码,注释还是映射输入文件都由您决定。
答案 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());
}
}
}
如果删除public
,getFields()
将返回一个空数组。
答案 2 :(得分:0)
我可以看到两个问题:
您正在创建obj
作为Object
类型。 Field.set()
的第一个参数需要与包含该字段的类相同(或子类型)。您需要使用反射来创建与targetObj
相同类型的对象,方法是使用obj = targetObj.getClass().newInstance()
(假设默认构造函数可用)
此外,您的问题可能是getFields()
方法仅返回该类的公共字段。
targetObj.getClass()。getFields()
如果要获取该类的所有字段,则需要使用getDeclaredFields()方法。