码迷,mamicode.com
首页 > 编程语言 > 详细

Java中对比两个对象中属性值[反射、注解]

时间:2015-04-16 15:55:23      阅读:152      评论:0      收藏:0      [点我收藏+]

标签:

             Java中通常要比较两个对象在修改前与修改后的值是否相同,一般我们采用的是反射技术获取对象的get方法[或其他的方法]获取值并做比较。如果系统将修改的属性名称也显示出来,这样就能更直观的显示类中的哪一个属性的值被修改了。然后Java中只能获取属性的名称,也就是英文标识的属性名,但是一般我们都会在属性后面添加属性的注释,但是Java不提供注释获取的方法。所以我们只能使用另外一种方式来将属性和属性注释关联起来,这就是Java中的@Annotation

    

public static  Map<String, Map<String, String>> compile(Object db,
			Object new_) {
		Map<String, Map<String, String>> map = new HashMap<String, Map<String, String>>();//存放修改前与修改后的属性值
		Class<Object> cDb = (Class<Object>) db.getClass();
		Field[] filesDb = cDb.getDeclaredFields();
		Class<Object> cNew_ = (Class<Object>) new_.getClass();
		Map<String, String> valDbMap = new HashMap<String, String>();//存放修改前的已修改的值
		Map<String, String> valNewMap = new HashMap<String, String>();//存放修改后的值
		for (Field field : filesDb) {
			String getMethodName = "get"
					+ field.getName().substring(0, 1).toUpperCase()
					+ field.getName().substring(1);
			try {
				Method mdb = (Method) cDb.getMethod(getMethodName);
				Method mNew_ = (Method) cNew_.getMethod(getMethodName);
				//自定义实现的注解类
				Annotation meta = mdb.getAnnotation(Annotation.class);  
				try {
					if(meta!= null){
						Object valDb = mdb.invoke(db);
						Object valNew = mNew_.invoke(new_);
						if (valDb != null) {
							if (!valDb.equals(valNew)) {
									 valDbMap.put(meta.annotation(), String.valueOf(valDb));
									 valNewMap.put(meta.annotation(), String.valueOf(valNew));
							}
						}
					}
				} catch (IllegalAccessException e) {
					e.printStackTrace();
				} catch (IllegalArgumentException e) {
					e.printStackTrace();
				} catch (InvocationTargetException e) {
					e.printStackTrace();
				} 
			} catch (NoSuchMethodException e) {
				log.debug("没有这个方法可显示调用");
			} catch (SecurityException e) {
				e.printStackTrace();
			}
		}
		map.put("更改前", valDbMap);
		map.put("更改后", valNewMap);
		return map;
	}

   后面提供注解类,这里比较简单,其实不想写的,但是为了方便需要的人还是提供自定义的注解类:

@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
public @interface Annotation {
	public String annotation();
}

    注解类的定义这块我就不说了。怎么使用呢,在我们需要比较的类的方法上面添加@Annotation(annotation="注释")

    此案例中我的方法是get方法。   后面的我就不提供了,有问题的欢迎提出。

Java中对比两个对象中属性值[反射、注解]

标签:

原文地址:http://my.oschina.net/yuyidi/blog/402378

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!