java比较两个相同对象的属性是否一致
2017-11-21 16:53
876 查看
主类
import java.beans.PropertyDescriptor;
import java.lang.reflect.Field;
import java.lang.reflect.Method;
public class CompareObejct<T> {
private CompareStatus status;
/**
* 之前原始的值
*/
private T original;
/**
* 当前的值
*/
private T current;
public CompareStatus getStatus() {
return status;
}
public T getOriginal() {
return original;
}
public void setOriginal(T original) {
this.original = original;
}
public T getCurrent() {
return current;
}
public void setCurrent(T current) {
this.current = current;
}
public void contrastObj(Class<T> cls) {
if(this.original==null){
this.status=CompareStatus.NEW;
return;
}
if(this.status==CompareStatus.REMOVE){
return;
}
boolean isEqual=true;
try {
//Class clazz = this.original.getClass();
Field[] fields = cls.getDeclaredFields();
for (Field field : fields) {
PropertyDescriptor pd = new PropertyDescriptor(field.getName(), cls);
Method getMethod = pd.getReadMethod();
Object o1 = getMethod.invoke(this.original);
Object o2 = getMethod.invoke(this.current);
String s1 = o1 == null ? "" : o1.toString();//避免空指针异常
String s2 = o2 == null ? "" : o2.toString();//避免空指针异常
//思考下面注释的这一行:会bug的,虽然被try catch了,程序没报错,但是结果不是我们想要的
//if (!o1.toString().equals(o2.toString())) {
if (!s1.equals(s2)) {
//textList.add("不一样的属性:" + field.getName() + " 属性值:[" + s1 + "," + s2 + "]");
isEqual=false;
System.out.println("不一样的属性:" + field.getName() + " 属性值:[" + s1 + "," + s2 + "]");
}
}
} catch (Exception e) {
System.out.println(e.getMessage());
}
if(isEqual){
this.status=CompareStatus.NO_CHANGE;
}else{
this.status=CompareStatus.CHANGE;
}
}
}
枚举
public enum CompareStatus {
/**
* 标记新数据
*/
NEW,
/**
* 标记变更数据
*/
CHANGE,
/**
* 标记没有变更
*/
NO_CHANGE,
/**
* 标记移除数据
*/
REMOVE
}
测试
public class CompareTest {
/**
* @param args
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
BDCommend obj1 = new BDCommend();
obj1.setBzjlbh("1111");
obj1.setHjrq(new Date());
BDCommend obj2 = new BDCommend();
obj2.setBzjlbh("1112");
obj2.setHjrq(new Date());
CompareObejct compare = new CompareObejct();
compare.setCurrent(obj1);
compare.setOriginal(obj2);
compare.contrastObj(BDCommend.class);
System.out.println(compare.getStatus());
}
}
import java.beans.PropertyDescriptor;
import java.lang.reflect.Field;
import java.lang.reflect.Method;
public class CompareObejct<T> {
private CompareStatus status;
/**
* 之前原始的值
*/
private T original;
/**
* 当前的值
*/
private T current;
public CompareStatus getStatus() {
return status;
}
public T getOriginal() {
return original;
}
public void setOriginal(T original) {
this.original = original;
}
public T getCurrent() {
return current;
}
public void setCurrent(T current) {
this.current = current;
}
public void contrastObj(Class<T> cls) {
if(this.original==null){
this.status=CompareStatus.NEW;
return;
}
if(this.status==CompareStatus.REMOVE){
return;
}
boolean isEqual=true;
try {
//Class clazz = this.original.getClass();
Field[] fields = cls.getDeclaredFields();
for (Field field : fields) {
PropertyDescriptor pd = new PropertyDescriptor(field.getName(), cls);
Method getMethod = pd.getReadMethod();
Object o1 = getMethod.invoke(this.original);
Object o2 = getMethod.invoke(this.current);
String s1 = o1 == null ? "" : o1.toString();//避免空指针异常
String s2 = o2 == null ? "" : o2.toString();//避免空指针异常
//思考下面注释的这一行:会bug的,虽然被try catch了,程序没报错,但是结果不是我们想要的
//if (!o1.toString().equals(o2.toString())) {
if (!s1.equals(s2)) {
//textList.add("不一样的属性:" + field.getName() + " 属性值:[" + s1 + "," + s2 + "]");
isEqual=false;
System.out.println("不一样的属性:" + field.getName() + " 属性值:[" + s1 + "," + s2 + "]");
}
}
} catch (Exception e) {
System.out.println(e.getMessage());
}
if(isEqual){
this.status=CompareStatus.NO_CHANGE;
}else{
this.status=CompareStatus.CHANGE;
}
}
}
枚举
public enum CompareStatus {
/**
* 标记新数据
*/
NEW,
/**
* 标记变更数据
*/
CHANGE,
/**
* 标记没有变更
*/
NO_CHANGE,
/**
* 标记移除数据
*/
REMOVE
}
测试
public class CompareTest {
/**
* @param args
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
BDCommend obj1 = new BDCommend();
obj1.setBzjlbh("1111");
obj1.setHjrq(new Date());
BDCommend obj2 = new BDCommend();
obj2.setBzjlbh("1112");
obj2.setHjrq(new Date());
CompareObejct compare = new CompareObejct();
compare.setCurrent(obj1);
compare.setOriginal(obj2);
compare.contrastObj(BDCommend.class);
System.out.println(compare.getStatus());
}
}
相关文章推荐
- java比较两个对象(类)是否相同
- Java相同类型的两个对象比较属性值,得到不同属性的名称和对应的值,附代码实例
- 定义Person类,Person类中含有两个属性name 和age ,使用compare方法比较两个对象是否为同一个对象。假定name 和age 都相同就似为同一个对象
- java 对象比较 判断两个对象的某些或某个属性相同 这对象相等。
- C#中比较两个对象的地址是否相同(也是引用计数的问题,和Java一样)
- Java中比较两个对象是否相同
- 教程-Delphi中比较两个对象是否一致及地址是否相同
- java 反射比较两个类型相同的对象 内部的变量是否相等
- Delphi中比较两个对象是否一致及地址是否相同
- Java比较两个对象是否相同并获得不同的字段
- 再论:比较两个对象的属性值是否相同 [ 光影人像 东海陈光剑 的博客 ]
- 比较两个java.util.Date 的日期(年月日)是否相同(忽略时、分、秒)的多种方法
- Java课程设计 比较两个文件内容是否相同
- java积累---------java判断两个set里的对象值完全相同----两个set中的值是否相等
- 比较检查一个指定对象是否是特定的类型,或者两个对象的类型是否相同
- Java中如何比较两个数组中元素是否相同
- 利用java反射机制比较同一个bean的两个对象的值是否相同
- 6-2-1 字符串-字符串变量String-创建字符串变量-初始化字符串变量-字符串连接-输入字符串(单词、行)-对象变量的赋值-比较两个字符串是否同一个-比较两个字符串内容是否相同
- 深入java的equals方法,怎么比较两个对象的内容是否相等?对象的内容指的是什么?
- 比较两个实例对象是否相同的方法