zfliaokai 2011-02-27 16:18
浏览 680
已采纳

关于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条回答 默认 最新

  • 「已注销」 2011-02-27 17:43
    关注
    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下

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论

报告相同问题?

悬赏问题

  • ¥20 有关区间dp的问题求解
  • ¥15 多电路系统共用电源的串扰问题
  • ¥15 slam rangenet++配置
  • ¥15 有没有研究水声通信方面的帮我改俩matlab代码
  • ¥15 对于相关问题的求解与代码
  • ¥15 ubuntu子系统密码忘记
  • ¥15 信号傅里叶变换在matlab上遇到的小问题请求帮助
  • ¥15 保护模式-系统加载-段寄存器
  • ¥15 电脑桌面设定一个区域禁止鼠标操作
  • ¥15 求NPF226060磁芯的详细资料