我需要从ResultSet
检索值,以便通过reflexion使用它们来调用构造函数。
我正在尝试使用Class.cast(Object),但我总是得到InvalidCastException
。
这就是我所拥有的:
Object[] args = new Object[count];
Class<?>[] arr = co.getParameterTypes();
for(i = 0; i<args.length; i++){
args[i] = arr[i].cast(rs.getObject(i+1));
}
Object t;
try {
t = co.newInstance(args);
} catch (Exception e) {
throw new RuntimeException(e);
}
return (T)t;
co是构造函数,rs是我已经拥有的ResultSet
。
答案 0 :(得分:1)
即使你可以让它工作,也存在一个长期的维护噩梦,即Object的构造函数中的参数顺序可能与ResultSet
中的列的顺序不匹配(RDB中的表) )。例如,如果您的Person
对象的构造函数采用firstName,lastName,则DB表中列的顺序可能不匹配。它可能是LAST_NAME,FIRST_NAME,甚至是FIRST_NAME,SOME_COLUMN_YOU_DONT_CARE_ABOUT,LAST_NAME。
在代码中我看到更一般地处理这个问题,他们使用对域对象(例如Person)的反射来获取属性名称(在我的例子中,他们看了setter,而不是构造函数,YMMV),然后尝试使用ResultSet
将其与ResultSet.getMetaData()
列名称匹配。