关于Class类,getDeclaredField(String name)疑惑

小弟在该方法执行Field field = cla.getDeclaredField(columnName);的时候出现一下异常:
java.lang.NoSuchFieldException: c_name

c_name是数据库中的一个字段。

代码如下:
public List find(String sql, Class cla, Object... obj) throws Exception {

    List list = new ArrayList();
    Connection con = DBConnection.getConnection();
    PreparedStatement pst = null;
    ResultSet rs = null;
    try {
        pst = con.prepareStatement(sql);
        for(int i = 0;i <obj.length;i++){
            pst.setObject(i+1, obj[i]);
        }
        rs = pst.executeQuery();
        while(rs.next()){
            //通过类模板获得javabean对象,每一行数据都对应一个javabean对象
            Object object = cla.newInstance();
            //通过结果集获得元数据(包括列名,查询的列数等等)
            ResultSetMetaData meta = rs.getMetaData();
            //循环查询出的列数据
            for(int i = 1;i <= meta.getColumnCount();i++){
                //获得每条数据的列名
                String columnName = meta.getColumnName(i);
                try {
                    //根据列名找到Javabean中对应的属性
                    Field field = cla.getDeclaredField(columnName);
                    //如果访问的属性是私有的,必须加上setAccessible(true)才能访问
                    field.setAccessible(true);
                    //给Javabean的属性设置值
                    field.set(object, rs.getObject(columnName));
                } catch (Exception e) {
                    System.out.println(e.getMessage());
                    throw e;
                } 
            }
            list.add(object);
        }
    } catch (Exception e) {
        System.out.println(e.getMessage());
        throw e;

    } finally{
        DBConnection.close(con, pst, null);
    }
    return list;
}

麻烦各位大神了。。小弟才学习不久。。。还望海涵。。

  1. 先贴上JDK API Document:
    getDeclaredField
    返回一个 Field 对象,该对象反映此 Class 对象所表示的类或接口的指定已声明字段。name 参数是一个 String,它指定所需字段的简称。注意,此方法不反映数组类的 length 字段。

  2. cla代表的类中没有定义属性c_name所以就会出NoSuchFieldException

你准备做一个类似Hibernate或者Ibaties的东东吗???

呵呵:

例子:
比如里的class cla类似这个:
class Cla {
private int abc;
private String name;
... setter and getter method ...
}

为了映射写sql可以这样写:
select t.id abc, t.c_name name from table_name t;

你再test下