5

I need to retrieve the values from a ResultSet to use them via reflexion to invoke a constructor. I was trying with Class.cast(Object), but I always get an InvalidCastException.

This is what I have:

    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 is the constructor, and rs is the ResultSet I already have.

4

1 回答 1

1

即使你可以让它工作,也有一个长期维护的噩梦,即对象构造函数中的参数顺序可能与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().

于 2013-06-29T18:57:13.833 回答