- 概念
内省(Introspector) 是Java 语言对 JavaBean 类属性、事件的一种缺省处理方法。JavaBean是一种特殊的类,主要用于传递数据信息,这种类中的方法主要用于访问私有的字段,且方法名符合某种命名规则。如果在两个模块之间传递信息,可以将信息封装进JavaBean中,这种对象称为“值对象”(Value Object),或“VO”。方法比较少。这些信息储存在类的私有变量中,通过set()、get()获得。
- PropertyDescriptor类:
PropertyDescriptor类表示JavaBean类通过存储器导出一个属性。主要方法:1. getPropertyType(),获得属性的Class对象;2. getReadMethod(),获得用于读取属性值的方法;getWriteMethod(),获得用于写入属性值的方法;3. hashCode(),获取对象的哈希值;4. setReadMethod(Method readMethod),设置用于读取属性值的方法;5. setWriteMethod(Method writeMethod),设置用于写入属性值的方法。
- Introspector类:
将JavaBean中的属性封装起来进行操作。在程序把一个类当做JavaBean来看,就是调用Introspector.getBeanInfo()方法,得到的BeanInfo对象封装了把这个类当做JavaBean看的结果信息,即属性的信息。
- 代码实现类的属性值比较
/**
* 对比俩个对象相同字段修改前后值的变化 --工具类
* @param obj1 新的对象
* @param obj2 旧的对象
* @param ignoreArr
* @return
*/
public static Map<String, List<Object>> compareFields(Object obj1, Object obj2, String[] ignoreArr) {
try{
Map<String, List<Object>> map = new HashMap<String, List<Object>>();
List<String> ignoreList = null;
if (ignoreArr != null && ignoreArr.length > 0) {
ignoreList = Arrays.asList(ignoreArr);
}
// 只有两个对象都是同一类型的才有可比性
if (obj1.getClass() == obj2.getClass()) {
Class clazz = obj1.getClass();
// 获取object的属性描述
PropertyDescriptor[] pds = Introspector.getBeanInfo(clazz,
Object.class).getPropertyDescriptors();
// 所有的属性
for (PropertyDescriptor pd : pds) {
// 属性名
String name = pd.getName();
// 如果当前属性选择忽略比较,跳到下一次循环
if (ignoreList != null && ignoreList.contains(name)) {
continue;
}
// get方法
Method readMethod = pd.getReadMethod();
// 在obj1上调用get方法等同于获得obj1的属性值
Object o1 = readMethod.invoke(obj1);
// 在obj2上调用get方法等同于获得obj2的属性值
Object o2 = readMethod.invoke(obj2);
if (o1 == null) {
continue;
}
if (o1 instanceof Date && o2 instanceof Date) {
o1 = ((Date) o1).getTime();
o2 = ((Date) o2).getTime();
}
// 比较这两个值是否相等,不等就可以放入map了
if (!o1.equals(o2)) {
List<Object> list = new ArrayList<Object>();
list.add(o1);
list.add(o2);
map.put(name, list);
}
}
}
return map;
}catch(Exception e){
e.printStackTrace();
return null;
}
}