其实就是出于“偷懒”,不想写那么多代码。
例如有个实体类people有下面的属性:
id int;
name String;
sex String;
age byte;
job String;然后有个ArrayList<Object> al=new ArrayList<Object>();
然后想用那个方法,自动把people里面的各个属性值,自动add入al里面?最好能有个通用的方法,因为我的项目里面,有很多不同的实体类。

解决方案 »

  1.   

    放到MAP不是更好?可以按照属性名字查。反射,你看看API吧,像Hibernate似的。
    不过哥们,你这样做,真的不符合面向对象的思想。
      

  2.   

    那就给你个核心方法吧!
    private void setFieldV(Field f,Object v,ResultSet rs) throws SQLException, IllegalArgumentException, IllegalAccessException {
    Class cls=f.getType();
    // String clsname=f.getType().getName();
    //System.out.println("fieldtype:"+clsname);
    if (cls.equals(java.util.Date.class)) {
    Date dd=rs.getTimestamp(f.getName());
    f.set(v,dd);
    } else if (cls.equals(java.lang.Long.class)) {
    Long ll;
    ll=new Long(rs.getLong(f.getName()));
    f.set(v,ll);
    //System.out.println("fieldtype========:"+clsname);
    } else if (cls.equals(long.class)) {
    long ll;
    ll=rs.getLong(f.getName());
    f.setLong(v,ll);
    } else if (cls.equals(java.lang.Integer.class)) {
    Integer ll;
    ll=new Integer(rs.getInt(f.getName()));
    f.set(v,ll);
    //System.out.println("fieldtype========:"+clsname);
    } else if (cls.equals(int.class)) {
    int ll;
    ll=rs.getInt(f.getName());
    f.setInt(v,ll);
    } else if (cls.equals(java.lang.Float.class)) {
    Float ll;
    ll=new Float(rs.getFloat(f.getName()));
    f.set(v,ll);
    //System.out.println("fieldtype========:"+clsname);
    } else if (cls.equals(float.class)) {
    float ll;
    ll=rs.getFloat(f.getName());
    //System.out.println("===="+ll);
    f.setFloat(v,ll);
    } else if (cls.equals(java.lang.Double.class)) {
    Double ll;
    ll=new Double(rs.getDouble(f.getName()));
    f.set(v,ll);
    //System.out.println("fieldtype========:"+clsname);
    } else if (cls.equals(double.class)) {
    double ll;
    ll=rs.getDouble(f.getName());
    f.setDouble(v,ll);
    } else if (cls.equals(java.lang.StringBuffer.class)) {
    StringBuffer ll=null;
    Clob content=rs.getClob(f.getName());
    if (content!=null) {
         String buf= content.getSubString(1,(int)content.length());
         ll = new StringBuffer(buf); }
    f.set(v,ll) ;
    } else {
    f.set(v,rs.getString(f.getName()));

      

  3.   

    先谢谢上面几位网友。
    答3楼:用属性名字做key放到Map里面的话,也是不能用循环啊,而且不同的类,还要写不同的代码哩。当然,如果可以用循环的方式把属性名字取出来的话,就已经差不多和我的需求一致了。确实,用循环的话是破坏了面向对象的思想,但我觉得,用SSH等等不同的框架,包括最简单的MVC结构,都是和面向对象的思想在某种程度上是相违背的。其他几位网友说的反射,我的水平较低,还没有接触过,请问5楼的网友,你的代码算不算是用了“反射”呢?有没有反射的一些代码呢?昨晚我想到一个类:Enum枚举类,我看了一下,也在电脑上试了一下,不得要领,不知道怎么用这个类,请问是否可以把一个放到里面,然后在枚举出来放到ArrayList或者Map里面呢?
      

  4.   

    如果你的people的属性不是private,那就简单了
                    People p = new People();
                    ...........
    Field[] fields = p.getClass().getDeclaredFields();
    for(Field f : fields) {
    System.out.println(f.get(o));
    }
      

  5.   

    如果是标准的javaBean可以用这个 Method[] methods = p.getClass().getDeclaredMethods();

    for(Method m : methods) {
    if(m.getName().startsWith("get"))
    System.out.println(m.invoke(p));
    }
      

  6.   

    建议用map HashMap map = new HashMap();

    Method[] methods = p.getClass().getDeclaredMethods();
    for(Method m : methods) {
    if(m.getName().startsWith("get")) {
    map.put(m.getName().toLowerCase().replaceAll("get", ""), m.invoke(p));
    }
    }

    for(Object key : map.keySet()) {
    System.out.println(key + ": " + map.get(key));
    }
      

  7.   


    [code=Java]package wwww;
    //我以为你用HashSet保存一个对象比较好,以为HashSet不可以保存相同的对象。
    //如果你要ArrayList保存的话,对象就不用implements Serializable了,
    // 建议你用HashSet比较好,当然看看你的实际情况了。
    // 
    import java.io.Serializable;
    public class People implements Serializable{
    /**
     * implements Serializable
             * 《必须》就要覆盖equals(Object obj)和hashCode()方法。这里我只根据id判断而已。
     */
    private static final long serialVersionUID = 997106258691414833L;
    private int id;
    private String name;
    private String sex;
    private byte age;
    private String job;
    public People( int id, String job, String name, byte age,String sex)
    {
    super();
    this.age = age;
    this.id = id;
    this.job = job;
    this.name = name;
    this.sex = sex;
    }
    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 String getSex()
    {
    return sex;
    }
    public void setSex(String sex)
    {
    this.sex = sex;
    }
    public byte getAge()
    {
    return age;
    }
    public void setAge(byte age)
    {
    this.age = age;
    }
    public String getJob()
    {
    return job;
    }
    public void setJob(String job)
    {
    this.job = job;
    }
    public int hashCode() {
    return id;
    }
    public boolean equals(Object obj) {
    if(obj instanceof People){
    People agent = (People)obj;
    if(agent.id==id){
    return true;
    }
    }
    return false;
    }
    public String toString()
    {
    return name+" "+id+" "+sex+" "+job+" "+age;
    }
    }package wwww;import java.util.HashSet;
    import java.util.Set;public class Test
    {
    public static void main(String[] args)
    {
    Set<People> set = new HashSet<People>();
    byte b=1;
    People p1 = new People(911,"yang","男",b,"java");
    People p2 = new People(912,"zhu","女",b,"c++");
    People p3 = new People(912,"zhang","女",b,"c");
    set.add(p1);
    set.add(p2);
    set.add(p3);
    System.out.println(set.size()+"个people");
    System.out.println(set);
    }
    }
    [/code]
      

  8.   


    就是反射,很简单的,你用一下就清楚了:Field[] fields = obj.getClass().getDeclaredFields();fields 就是你所要的,如果只想取public 的field,则 obj.getClass().getFields();
    如果还有其它需要可以参考
    obj.getClass().getxxx 函数,看名字就就大概知道有什么东西.
      

  9.   

    是的,想一了百了,反射是好选择,不过反射现在用的太多了,ssh层层有反射,效率问题不得不考虑。
    个人愚见,所谓反射是指在运行期(而不是在编译期)动态加载一个类文件转化为对象(Class)到内存中,并由java.lang.reflect包中提供的一些类进行操作(有构造方法、方法、等等),通过遍历可以获取所有的方法签名及参数列表等内容,并根据此判断建立所需的方法对象,并调用之。
    代码其实不难,但想写好却不容易,通常类似的逻辑都挺复杂,多思考一下hibernate是如何根据配置文件将对应的值赋给pojo的,这个算是很典型的例子