[原创]Java使用反射及自定义注解实现对象差异性比较
@Target(ElementType.FIELD)
@Retention(RetentionPolicy.RUNTIME)
public @interface RevisionColumn {
String value();
}
public class ResourceItem {
private int id;
private int revision;
private ResourceItemStatus status;
@RevisionColumn("节点")
private String node;
@RevisionColumn("是否物理隔离")
private boolean physicalIsolation;
@RevisionColumn("整机:单盘上限(%)")
private int machineDiskLimit;
//...
}
public class FieldChangeInfo implements Serializable{
private String propertyName;
private String propertyHeader;
private Object from;
private Object to;
public FieldChangeInfo() {
}
public FieldChangeInfo(String propertyName, String propertyHeader, Object from, Object to) {
this.propertyName = propertyName;
this.propertyHeader = propertyHeader;
this.from = from;
this.to = to;
}
@Override
public boolean equals(Object obj) {
if (!(obj instanceof FieldChangeInfo))
return false;
if (obj == this)
return true;
FieldChangeInfo rhs = (FieldChangeInfo) obj;
return new EqualsBuilder().
append(propertyName, rhs.propertyName).
append(propertyHeader, rhs.propertyHeader).
append(from, rhs.from).
append(to, rhs.to).
isEquals();
}
public String getPropertyName() {
return propertyName;
}
public void setPropertyName(String propertyName) {
this.propertyName = propertyName;
}
public String getPropertyHeader() {
return propertyHeader;
}
public void setPropertyHeader(String propertyHeader) {
this.propertyHeader = propertyHeader;
}
public Object getFrom() {
return from;
}
public void setFrom(Object from) {
this.from = from;
}
public Object getTo() {
return to;
}
public void setTo(Object to) {
this.to = to;
}
}
FieldChangeInfo
public static List<FieldChangeInfo> getResourceItemFieldChangeInfo(ResourceItem originalItem, ResourceItem updatedItem) {
try {
List<FieldChangeInfo> fieldChangeInfos = new LinkedList<>();
for (Field field : ResourceItem.class.getDeclaredFields()) {
RevisionColumn revisionColumn = field.getAnnotation(RevisionColumn.class);
if (revisionColumn != null)
{
field.setAccessible(true);
Object originalValue = field.get(originalItem);
Object updatedValue = field.get(updatedItem);
if (originalValue == null && updatedValue == null)
continue;
if (originalValue == null || !originalValue.equals(updatedValue)){
FieldChangeInfo fieldChangeInfo = new FieldChangeInfo();
fieldChangeInfo.setFrom(originalValue);
fieldChangeInfo.setTo(updatedValue);
fieldChangeInfo.setPropertyName(field.getName());
fieldChangeInfo.setPropertyHeader(revisionColumn.value());
fieldChangeInfos.add(fieldChangeInfo);
}
}
}
return fieldChangeInfos;
} catch (IllegalAccessException e) {
throw new RuntimeException("检测ResourceItem字段变更时出现异常");
}
}
getResourceItemFieldChangeInfo
[原创]Java使用反射及自定义注解实现对象差异性比较的更多相关文章
- java 利用反射完成自定义注解
元注解: 元注解的作用就是负责注解其他注解.Java5.0定义了4个标准的meta-annotation类型,它们被用来提供对其它 annotation类型作说明.Java5.0定义的元注解: 1.@ ...
- 利用反射跟自定义注解拼接实体对象的查询SQL
前言 项目中虽然有ORM映射框架来帮我们拼写SQL,简化开发过程,降低开发难度.但难免会出现需要自己拼写SQL的情况,这里分享一个利用反射跟自定义注解拼接实体对象的查询SQL的方法. 代码 自定义注解 ...
- Android面试基础(一)IOC(DI)框架(ViewUtils)讲解_反射和自定义注解类
1. Android中的IOC(DI)框架 1.1 ViewUtils简介(xUtils中的四大部分之一) IOC: Inverse of Controller 控制反转. DI: Dependenc ...
- Java反射与自定义注解
反射,在Java常用框架中屡见不鲜.它存在于java.lang.reflact包中,就我的认识,它可以拿到类的字段和方法,及构造方法,还可以生成对象实例等.对深入的机制我暂时还不了解,本篇文章着重在使 ...
- java基础知识:自定义注解
转自 深入了解注解 要深入学习注解,我们就必须能定义自己的注解,并使用注解,在定义自己的注解之前,我们就必须要了解Java为我们提供的元注解和相关定义注解的语法. 元注解的作用就是负责注解其他注解.J ...
- 【java开发系列】—— 自定义注解
之前在开发中,就总纳闷,为什么继承接口时,会出现@Override注解,有时候还会提示写注解@SuppressWarnings? 原来这是java特有的特性,注解! 那么什么是注解呢? 注解就是某种注 ...
- JAVA中如何定义自定义注解
了解注解 注解是Java1.5,JDK5.0引用的技术,与类,接口,枚举处于同一层次 .它可以声明在包.类.字段.方法.局部变量.方法参数等的前面,用来对这些元素进行说明,注释 . 在Java中,自带 ...
- AOP通过反射获取自定义注解
自定义注解: @Target({ElementType.METHOD}) @Retention(RetentionPolicy.RUNTIME) @Documented @Component publ ...
- [原创]java WEB学习笔记15:域对象的属性操作(pageContext,request,session,application) 及 请求的重定向和转发
本博客为原创:综合 尚硅谷(http://www.atguigu.com)的系统教程(深表感谢)和 网络上的现有资源(博客,文档,图书等),资源的出处我会标明 本博客的目的:①总结自己的学习过程,相当 ...
随机推荐
- [eShopOnContainers 学习系列] - 01 - Roadmap and Milestones for future releases
https://github.com/dotnet-architecture/eShopOnContainers/wiki/01.-Roadmap-and-Milestones-for-future- ...
- Rope的简单介绍
repo的一些用法和理解 repo简单来讲就是一种调用git的一个脚本文件,用来管软件项目的软件仓库配置文件,描述了软件之间的一些依赖关系. 在Google的android项目下: repo只是goo ...
- [置顶]
【机器学习PAI实践五】机器学习眼中的《人民的名义》
一.背景 最近热播的反腐神剧"人民的名义"掀起来一波社会舆论的高潮,这部电视剧之所能得到广泛的关注,除了老戏骨们精湛的演技,整部剧出色的剧本也起到了关键的作用.笔者在平日追剧之余, ...
- Android内存优化(二)DVM和ART的GC日志分析
相关文章 Android内存优化系列 Java虚拟机系列 前言 在Java虚拟机(三)垃圾标记算法与Java对象的生命周期这篇文章中,提到了Java虚拟机的GC日志.DVM和ART的GC日志与Java ...
- markdown 语法汇总
Markdown是什么? Markdown是一种轻量级标记语言,它以纯文本形式(_易读.易写.易更改_)编写文档,并最终以HTML格式发布. Markdown也可以理解为将以MARKDOWN语言编写的 ...
- Ubuntu 16.04 安装配置支持http2的nginx
第一步 安装最新版本的nginx 对于ubuntu16.04而言 直接装就是最新的 ``` sudo apt-get update sudo apt-get install nginx 查看Nginx ...
- 【MFC】对话框自带滚动条的使用
对话框自带滚动条的使用 摘自 http://wenku.baidu.com/link?url=aZe1zgBSBsf9xCYNpcz2fNGljmKxg372OVIGeJ7p6iRCWbbsertS7 ...
- 解决 Laravel/Lumen 出现 "Please provide a valid cache path" 问题
解决 Laravel/Lumen 出现 "Please provide a valid cache path" 问题 解决 Laravel/Lumen 出现 "Pleas ...
- Docker运行GUI软件的方法
转自 https://www.csdn.net/article/2015-07-30/2825340 简介: Docker通过namespace将容器与主机上的网络和运行环境进行了隔离,默认情况下,在 ...
- leetcode_sql_4,196
196. Delete Duplicate Emails Write a SQL query to delete all duplicate email entries in a table name ...