现在有个需求,要求任意类的两个对象中的实例变量的值的差异,我现在只知道可能要用到java的reflect机制,有做过的朋友可以指点一下吗?

解决方案 »

  1.   

    比如说有一个类Bean(我们并不知道类的具体细节),创建了该类的两个实例,比较两个实例之间的差异,比如某个成员变量的值不同,把比较结果以字符串的形式返回。
      

  2.   

    比如有个类
    public class Test
    {
       //两个实例变量
       public String field1;
       public String field2;   //构造函数
       public Test(String arg1,String arg2)
       {
         filed1 = arg1;
         filed2 = arg2;
       }    public static void main(String []args)
        { 
           //新建两个Test类的对象
           Test test1 = new Test("1","2");
           Test test2 = new Test("1","4");       //比较两个对象的方法,返回比较后的差异(比如:字段filed2,原值是2,新值是4)
           String result = //比较方法(test1,test2);
         }
    }
      

  3.   

    不知道符合你的意思没,供参考:
    /**
     * 创建日期:2005-12-28
     */
    package net.Yzl.spring.qs;文件一
    /**
     * @author Yzl
     *
     */
    public interface Action {

    public String execute(String str);}文件二
    /**
     * 创建日期;2005-12-28
     *
     */
    package net.Yzl.spring.qs;import java.lang.reflect.*;
    /**
     * @author Yzl
     *
     */
    public class LowerAction implements Action 
    {
    private String message;

    public String getMessage() 
    {
    return message;
    } public void setMessage(String message)
    {
    this.message = message;
    } public String execute(String str) 
    {
    return (getMessage() + str).toLowerCase();
    }


    public static void main(String[] args)
    {
    try {
    // 可以将UpperAction 改为LowerAction 其他接口均可不变
    Class cls = Class.forName("net.Yzl.spring.qs.LowerAction");
    Method mtd = cls.getMethod("setMessage",new Class[]{String.class});
    Object obj = cls.newInstance();

    mtd.invoke(obj,new Object[]{"Hello "});

    mtd = cls.getMethod("execute",new Class[]{String.class});

    //System.out.println(((LowerAction)obj).execute("Yzl"));
    System.out.println(mtd.invoke(obj,new Object[]{"Yzl"}));

    }catch(ClassNotFoundException e)
    {
    e.printStackTrace();

    }catch(NoSuchMethodException e)
    {
    e.printStackTrace();

    }catch(Exception e)
    {
    e.printStackTrace();
    }
    }}PS:UpperAction 和 LowerAction 相似,只不过execute函数输出大写字母上面只是简单示例了设置和调用出Bean成员变量的值,至于隐射出类中的其他函数,可以看看文档
      

  4.   

    String result = //比较方法(test1,test2);问一下,test1和test2是同类型的不?
      

  5.   

    我觉得覆写hashCode和equals方法不久可以了吗?!
      

  6.   

    import java.lang.reflect.*;public class Compare {
    private int i;
    private String s;

    public Compare(int i, String s){
    this.i = i;
    this.s = s;
    }
    public static String compareTwoOjb(Object o1, Object o2) 
    throws IllegalAccessException{
    String sValue = "";
    //不是同一类型
    if(!(o1.getClass() == o2.getClass())){
    return "Tow Object is not same type";
    }
    //同一类型但值相同
    if(o1.equals(o2)){
    return null;
    }
    Field[] fields = o1.getClass().getDeclaredFields();
    for(int i = 0; i < fields.length; i++){
    //设为可访问的
    fields[i].setAccessible(true);
    if(!fields[i].get(o1).equals(fields[i].get(o2))){
    sValue = "[ojb1." + fields[i].getName() + " = " 
    + fields[i].get(o1) + ", obj2." + fields[i].getName() 
    + " = " + fields[i].get(o2) + "]";
    }

    }

    return sValue;
    }

    public static void main(String[] args){
    try{
    String str = compareTwoOjb(new Compare(1, "11"), new Compare(1, "22"));
    System.out.println(str);
    }catch(Exception e){
    e.printStackTrace();
    }
        
        }
    }