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


                 在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="注释")

  • 相关阅读:
    桥接模式新解:客户端服务器模式
    laravel-admin 自定义导出表单
    PHP实现git部署的方法,可以学学!
    PHP的安全性问题,你能说得上几个?
    nginx的四个基本功能
    laravel orm
    laravel-admin列表排序在使用了$grid->model()->latest()后$grid其它加上sortable()可排序的列在排序时不起作用
    Laravel 5.4: 特殊字段太长报错 420000 字段太长
    关于在phpStudy环境下,windows cmd中 php不是内部命令问题
    phpstudy安装好之后mysql无法启动(亲测可行)
  • 原文地址:https://www.cnblogs.com/doudouxiaoye/p/5682702.html
Copyright © 2020-2023  润新知