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

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

public static  Map> compile(Object db,

Object new_) {

Map> map = new HashMap>();//存放修改前与修改后的属性值

Class cDb = (Class) db.getClass();

Field[] filesDb = cDb.getDeclaredFields();

Class cNew_ = (Class) new_.getClass();

Map valDbMap = new HashMap();//存放修改前的已修改的值

Map valNewMap = new HashMap();//存放修改后的值

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方法。   后面的我就不提供了,有问题的欢迎提出。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值