java反射获取类属性问题。
PHP中文网
PHP中文网 2017-04-18 10:28:16
0
3
823

代码:

 public static List<Object> select(String sql, String o)
                throws SQLException, ClassNotFoundException, InstantiationException, IllegalAccessException {
            Class c = Class.forName(o);
            Field[] fls = c.getDeclaredFields();
            List<String> list=  new ArrayList<>();
            for (int i = 0; i < fls.length; i++) {
                System.out.println("公有属性之" + fls[i].getName());
                list.add(fls[i].getName());
            }
            Object object = c.newInstance();
            List<Object> l = new ArrayList<>();
            stmt = conn.createStatement();
            ResultSet rs = stmt.executeQuery(sql);
            while (rs.next()) {
                // Retrieve by column name
                String id = rs.getString("href");
               String name = rs.getString("title");      
            // Display values
            System.out.print("ID: " + id);
            System.out.print(", name: " + name);
        }
        rs.close();
        stmt.close();
        conn.close();
        return l;

    }

我想获取传进来的类的所有属性,然后通过re.getString获得值,但是我不知道属性有多少个,在rs.next里for循环遍历的话就会失去rs的作用域。麻烦哪位大神帮我看看怎么写 = =。

PHP中文网
PHP中文网

认证0级讲师

répondre à tous(3)
Ty80

Je ne suis pas très doué en composition, donc je peux simplement le lire.

while(rs.next()){
    //cls: Class<T> cls
    T t=cls.newInstance();
    //rsmd: ResultSetMetaData rsmd
    for(int i=0;i<rsmd.getColumnCount();i++){
        errorIndex=i+1;
        String columnName=(rsmd.getColumnName(i+1)).toLowerCase();
        //rs: ResultSet rs
        Object obj=rs.getObject(columnName);
        if(null==obj) continue;
        columnName=String.valueOf(columnName.charAt(0)).toUpperCase()+columnName.substring(1);
        Method m;
        m=cls.getMethod("set"+columnName, obj.getClass());
        m.invoke(t, obj);
    }
    dataList.add(t);
}
小葫芦

Il y a effectivement un problème avec votre réflexion :
Même si vous souhaitez récupérer l'objet de classe, il est préférable de ne pas transmettre Class.formName, sauf si vous avez vraiment besoin de charger dynamiquement des classes externes.

Je ne sais pas si écrire de cette façon répond à vos exigences

public static List<Map<String,Object>> select(Object o)
             throws SQLException, ClassNotFoundException, InstantiationException, IllegalAccessException {
         Field[] fds=o.getClass().getDeclaredFields();
            String[] names=new String[fds.length];
            for(int i=0;i<fds.length;i++){
                names[i]=fds[i].getName();
                System.out.println(names[i]);
            }
        List<Map<String,Object>> list=new ArrayList<>();
         stmt = conn.createStatement();
         ResultSet rs = stmt.executeQuery(sql);
         while (rs.next()) {
             Map<String,Object> m=new HashMap<>();
             for(String name:names){
                 String tmp = rs.getString(name);
                 m.put(name, tmp);
             }
             list.add(m);  
         }
     rs.close();
     stmt.close();
     conn.close();
     return list;
小葫芦

org.springframework.jdbc.core.BeanPropertyRowMapper Implémentation toute faite, vous pouvez vous y référer et l'imiter.

Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal