Java POJO属性的获得

石岩 发布于 2011/07/29 16:07
阅读 1K+
收藏 0

【开源中国 APP 全新上线】“动弹” 回归、集成大模型对话、畅读技术报告”

下面是POJO实例:

class P {

    private int id;
    private String name;
    private int age;
    public int getId() {
        return id;
    }
    public void setId(int id) {
        this.id = id;
    }
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
    public int getAge() {
        return age;
    }
    public void setAge(int age) {
        this.age = age;
    }

}

下面是要实现的过程实例:

public class M {

    /**
     * @param args
     */
    public static void main(String[] args) {
       P p = new P();
       //如何应用对象p来得到类P的的id、name、age三个属性及类型
    }
}

 

 

以下是问题补充:

@石岩://如何应用对象p来得到类P的的id、name、age三个属性、类型及值呢? (2011/07/29 16:38)
加载中
0
好威支有希
好威支有希
p.getClass().getDeclaredFields()
0
石岩
石岩

引用来自“lcyu”的答案

p.getClass().getDeclaredFields()

那我用下面这样应用就可以显示属性名吧?

for(int i =1;i<p.getClass().getFields().length;i++){

      System.out.println(p.getClass().getFields()[i]);

}

0
石岩
石岩
怎么不运行没有显示呢。
0
高东
高东
私有属性,你这样访问不到吧!!!!!
0
大东哥
大东哥

引用来自“石岩”的答案

引用来自“lcyu”的答案

p.getClass().getDeclaredFields()

那我用下面这样应用就可以显示属性名吧?

for(int i =1;i<p.getClass().getFields().length;i++){

      System.out.println(p.getClass().getFields()[i]);

}

不行,必须是getDeclaredFields(),另外你那循环写成:

for(Field field : p.getClass().getDeclaredFields())

   System.out.println(field);

效果更好。

0
石岩
石岩
是在不知道POJO内部的情况下来获得内部的属性。这样可以动态组合SQL语句的内容及值
0
石岩
石岩

引用来自“东明”的答案

引用来自“石岩”的答案

引用来自“lcyu”的答案

p.getClass().getDeclaredFields()

那我用下面这样应用就可以显示属性名吧?

for(int i =1;i<p.getClass().getFields().length;i++){

      System.out.println(p.getClass().getFields()[i]);

}

不行,必须是getDeclaredFields(),另外你那循环写成:

for(Field field : p.getClass().getDeclaredFields())

   System.out.println(field);

效果更好。

这样是得到了属性,但输出的结果带有包名及类.属性。
0
石岩
石岩

引用来自“石岩”的答案

引用来自“东明”的答案

引用来自“石岩”的答案

引用来自“lcyu”的答案

p.getClass().getDeclaredFields()

那我用下面这样应用就可以显示属性名吧?

for(int i =1;i<p.getClass().getFields().length;i++){

      System.out.println(p.getClass().getFields()[i]);

}

不行,必须是getDeclaredFields(),另外你那循环写成:

for(Field field : p.getClass().getDeclaredFields())

   System.out.println(field);

效果更好。

这样是得到了属性,但输出的结果带有包名及类.属性。

这就是输出的结果:

private int com.xp.test.P.id

private java.lang.String com.xp.test.P.name

private int com.xp.test.P.age

这是单纯的得到id、name、age的结果不符呀。

石岩
石岩
@东明 : 找到错误了,谢谢!在sql的组合中,field.setAccessible(true);语句放置在for紧后才正确。
石岩
石岩
@东明 : 这是处理组合sql的方法: public synchronized String toSQL(Object obj, String mark) throws IllegalArgumentException, IllegalAccessException { Class clazz = obj.getClass(); Field[] fields = clazz.getDeclaredFields(); String sql = ""; if (mark.toLowerCase().equals("insert")) { sql = " insert into " + clazz.getSimpleName() + " "; String key = "(", value = "values("; int i = 1; for (Field field : fields) { field.setAccessible(true); if (fields.length == i) { key += field.getName() + ")"; value += field.get(obj) + ")"; i++; } else { key += field.getName() + ","; value += field.get(obj); i++; } } sql += key + value; } if (mark.toLowerCase().equals("select*")) { sql = " select * from " + clazz.getSimpleName() + " "; } if (mark.toLowerCase().equals("select")) { sql = " select " + getFields() + " from"; } if (mark.toLowerCase().equals("update")) { sql = " update " + clazz.getSimpleName() + " set "; int i = 1; String propType; Object fieldValue; for (Field field : fields) { propType = field.getType().getSimpleName(); fieldValue = field.get(obj); field.setAccessible(true); if (fields.length == i) { if (!fieldValue.equals("") && null != fieldValue) { if (propType.equals("int") && !fieldValue.equals(0)) { sql += field.getName() + "=" + fieldValue; } if (propType.equals("Integer") && !fieldValue.equals(0)) { sql += field.getName() + "=" + fieldValue; } if (propType.equals("String") && !fieldValue.equals("")) { sql += field.getName() + "=\'" + fieldValue + "\'"; } if (propType.equals("Date") && !fieldValue.equals("")) { sql += field.getName() + "=\'" + fieldValue + "\'"; } i++; } } else { if (!fieldValue.equals("") && null != fieldValue) { if (propType.equals("int") && !fieldValue.equals(0)) { sql += field.getName() + "=" + fieldValue + ","; } if (propType.equals("Integer") && !fieldValue.equals(0)) { sql += field.getName() + "=" + fieldValue + ","; } if (propType.equals("String") && !fieldValue.equals("")) { sql += field.getName() + "=\'" + fieldValue + "\',"; } if (propType.equals("Date") && !fieldValue.equals("")) { sql += field.getName() + "=\'" + fieldValue + "\',"; } i++; } } } } return sql; } 这是POJO: public class P { private int id; private String name; private int age; private Date date; public int getId() { return id; } public void setId(int id) { this.id = id; } public String getName() { return name; } public void setName(String name) { this.name = name; } public int getAge() { return age; } public void setAge(int age) { this.age = age; } public Date getDate() { return date; } public void setDate(Date date) { this.date = date; } } 这是测试过程: P p = new P(); p.setName("siyee"); p.setAge(25); p.setDate(new Date()); try { String sql = SQLUtils.getInstance().toSQL(p, "update"); System.out.println("sql:"+sql); } catch (IllegalArgumentException e) { e.printStackTrace(); } catch (IllegalAccessException e) { e.printStackTrace(); } 请你帮我看一下哪里有特别的错误,请求指导。谢谢!
大东哥
大东哥
@石岩 : 你仔细看下你的逻辑,这样是绝对可以的。
石岩
石岩
@东明 : 我刚才用了这个方法,但提示还是:java.lang.IllegalAccessException: Class com.xp.utils.SQLUtils can not access a member of class com.xp.test.P with modifiers "private" at sun.reflect.Reflection.ensureMemberAccess(Reflection.java:65) at java.lang.reflect.Field.doSecurityCheck(Field.java:960) at java.lang.reflect.Field.getFieldAccessor(Field.java:896) at java.lang.reflect.Field.get(Field.java:358) 的错误!
大东哥
大东哥
@石岩 : 可以得到,不过如果是私有的,得先field.setAccessible(true),才能访问。
下一页
0
石岩
石岩

引用来自“高东”的答案

私有属性,你这样访问不到吧!!!!!
这是是访问不到,必须设置为public才能访问得到。那这样只能设为public了吗?
OSCHINA
登录后可查看更多优质内容
返回顶部
顶部