比如2个bean,SubTestBean继承TestBean.
TestBean对象有2个private成员,通过public的get和set方法访问。
SubTestBean有3个private成员,同样通过public的get和set方法访问。现在需要做的是,如何判断2个SubTestBean对象相等。
第一个办法,通过反射,取得所有的SubTestBean成员,遍历比较。但是无法取得父类TestBean的2个private成员。另外一个办法,取得所有的public方法,将以get字母开头的方法全部调用一次,将返回值作比较。但是,不能保证get方法就是取成员变量的。有可能是取其他的2个方法都有问题,头疼啊,那位大哥帮忙解决了,给个思路吧。。

解决方案 »

  1.   

    用反射:通过判断是否是 get的方法 然后把这个get的方法值给取出来进行比较不就哦了
      

  2.   

    // 判断是否为get方法
    for(){
    ....
    if (oneMethodName.indexOf("get") > -1) {
    // 获得第一个bean的值
    String oneValued = oneBeanMethod.invoke(objUtilBeanOne, null).toString();
    String twoValued = oneBeanMethod.invoke(objUtilBeanTwo, null).toString();
     if(oneValued.equals(twoValued)){
       System.out.println("是相同的对象");
     }
    }
    把equlas方法给重写下就可以了
      

  3.   

    用反射:通过判断是否是 get的方法 然后把这个get的方法值给取出来进行比较不就哦了
    ===============
    问题在于,不能保证get方法取得的一定是成员变量,如果是其他的get方法,就不该调用。
      

  4.   

    晕 为什么不能保证get方法取得的一定是成员变量
    你可以以将非成员变量的方法改一下名字 不用get开头不是也可以吗
      

  5.   

    晕 为什么不能保证get方法取得的一定是成员变量
    你可以以将非成员变量的方法改一下名字 不用get开头不是也可以吗
    ================
    这个不是我能改的我不能保证非成员变量的取得方法一定不能get开头。那是别人的代码。我目前都没看到呢。现在的问题在于,如果有这种情况,如何解决。
      

  6.   

    首先成员变量 是private的 用反射得不到的
    要么 你定义一些 字段标识 成员变量的名字
    如:public static final String TEST_A="id";
        public static final String TEST_B="name";
        public static final String TEST_C="age";
        private String id;
        private String name;
        private String age;
    你通过 反射得到的 TEST_A,TEST_B,TEST_C 来控制是否是成员变量 
      

  7.   

    要么 你定义一些 字段标识 成员变量的名字
    如:public static final String TEST_A="id";
    public static final String TEST_B="name";
    public static final String TEST_C="age";
    ===================
    这个也不太可能,我不能修改别人的这部分代码。
      

  8.   

    Type a=method.getGenericReturnType();是一下  我没做过 查看方法的返回值类型
    你是一下
      

  9.   

    Class  a=method.getReturnType();用这个
    然后用 instanceof 来进行判断 是不是基本类型
      

  10.   

    然后用 instanceof 来进行判断 是不是基本类型
    =========
    就算不是基本类型,也仍然有可能是成员变量。比如arraylist。
      

  11.   

    来混java版了?这个你可以重载SubTestBean类的equals()方法。然后这样调用:obj1.equals(obj2);
      

  12.   

    重载equals方法应该可以解决的,传进来的类很容易获得它的方法,自己的方法也很好获得吧,然后就比较喽
      

  13.   

    public boolean equals(Object o){
        if(!(o instanceof SubTestBean))
            return false;
        
        SubTestBean oo = (SubTestBean)o;
        if(!oo.getX().equals(getX())) return false;
        if(!oo.getY().equals(getY())) return false;
        if(!oo.getZ().equals(getZ())) return false;    return true;
    }
      

  14.   

    重写equals方法。老老实实比较3+2个get。
    另外,改写equals也要改写hashCode
      

  15.   

    自己重载equals和hashCode方法。
      

  16.   

    如果不能重载equals来解决问题
    那还能怎么办?
    看LZ意思好象是取成员变量的是哪个方法都不知道
    这还怎么比较啊
      

  17.   

    赫赫 重写equals hashcode两个方法是硬道理我们不能沿着搂住的思路错误的思考哦哦
      

  18.   

    重写equals和hashcode两个方法
    不建议用反射-太慢,而且不好控制.
      

  19.   

    如果类SubTestBean是自己写的最好是实现 equals 这个是最有效的。
    如果不是继承一下实现 equals。
    最好不要用反射,效率低下还不好控制,不要怕麻烦。
      

  20.   

    父类和子类都重写 equals方法
    父类中比较父类的私有成员
    子类中的比较子类的私有成员
    子类先调用 super.equals()然后将其结果与子类的相与
    ps:我觉得既然是私有成员,那么最好不要以任何方法来获取其值,如果有这样的需求,那么设计就有问题,解决的方法就是在该类中实现一个public方法(如本例中的equals)来实现你的访问私有成员的需求
      

  21.   

    我确实是想重写equals,当然,hashcode也是要重写的。
    问题在于父类的私有成员各位高手还有更好的建议么?
      

  22.   

    写一个方法增加到SubTestBean对象
    把你要比较的对象属性全部加起来返回
    比较通过这个方法返回得到的东东来比较两个对象是不是相等