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 求数据集和代码#有偿答复
  • ¥15 关于下拉菜单选项关联的问题
  • ¥20 java-OJ-健康体检
  • ¥15 rs485的上拉下拉,不会对a-b<-200mv有影响吗,就是接受时,对判断逻辑0有影响吗
  • ¥15 使用phpstudy在云服务器上搭建个人网站
  • ¥15 应该如何判断含间隙的曲柄摇杆机构,轴与轴承是否发生了碰撞?
  • ¥15 vue3+express部署到nginx
  • ¥20 搭建pt1000三线制高精度测温电路
  • ¥15 使用Jdk8自带的算法,和Jdk11自带的加密结果会一样吗,不一样的话有什么解决方案,Jdk不能升级的情况
  • ¥15 画两个图 python或R