测试代码
package main
import java.lang.reflect.Method
import java.text.SimpleDateFormat
import bean.Bird
import bean.Cat
public class DiffObjectMainTest {
private static String FORMAT_PATTERN = "yyyy-MM-dd HH:mm:ss"
public static void main(String[] args) throws Exception {
SimpleDateFormat format = new SimpleDateFormat(FORMAT_PATTERN)
Bird b1 = new Bird()
b1.setName("Bird11111")
b1.setAge(20)
b1.setBirthday(format.parse("2016-10-11 23:45:43"))
b1.setIsOld(true)
Bird b2 = new Bird()
b2.setName("Bird2222222")
b2.setAge(50)
b2.setBirthday(format.parse("2014-10-11 23:45:43"))
b2.setIsOld(true)
Cat cat = new Cat("cat")
System.out.println(DiffObject(b1, b2))
System.out.println(DiffObject(b1, cat))
}
public static String DiffObject(Object beforeObject,Object afterObject) throws Exception{
if(!beforeObject.getClass().equals(afterObject.getClass()))
return ""
SimpleDateFormat format = new SimpleDateFormat(FORMAT_PATTERN)
StringBuffer resultBuffer = new StringBuffer()
Class<?> clazz = beforeObject.getClass()
Method[] methods = clazz.getDeclaredMethods()
for(Method method:methods){
String methodName = method.getName()
if(methodName.contains("get")){
Object beforeValue = method.invoke(beforeObject)
Object afterValue = method.invoke(afterObject)
if(!beforeValue.equals(afterValue)){
StringBuilder methodNameBuilder = new StringBuilder(methodName.substring(3))
methodNameBuilder.setCharAt(0, Character.toLowerCase(methodNameBuilder.charAt(0)))
String returnType = method.getReturnType().getSimpleName()
resultBuffer.append("字段: ").append(methodNameBuilder.toString()).append(":").append(returnType).append(" ")
if(returnType.equalsIgnoreCase("Date")){
resultBuffer.append(" before: ").append(format.format(beforeValue)).append(" after: ").append(format.format(afterValue)).append(" ")
}else{
resultBuffer.append(" before: ").append(beforeValue).append(" after: ").append(afterValue).append(" ")
}
}
}
}
return resultBuffer.toString()
}
}
运行结果
字段: name:String before: Bird11111 after: Bird2222222 字段: birthday:Date before: 2016-10-11 23:45:43 after: 2014-10-11 23:45:43 字段: age:Integer before: 20 after: 50