在Java中通常要比较两个对象在修改前与修改后的值是否相同,一般我们采用的是反射技术获取对象的get方法[或其他的方法]获取值并做比较。如果系统将修改的属性名称也显示出来,这样就能更直观的显示类中的哪一个属性的值被修改了。然后Java中只能获取属性的名称,也就是英文标识的属性名,但是一般我们都会在属性后面添加属性的注释,但是Java不提供注释获取的方法。所以我们只能使用另外一种方式来将属性和属性注释关联起来,这就是Java中的@AnnotationCompare
import lombok.extern.log4j.Log4j2;
import java.lang.reflect.Field;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import java.util.HashMap;
import java.util.Map;
/**
*两对象属性比较工具
* @version V1.0
* @date 2021/11/11 10:20
*/
@Log4j2
public class ObjectCompareUtil {
/**
* 比较两对象属性
* @param db
* @param new_
* @return
*/
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);
//自定义实现的注解类
AnnotationCompare meta = field.getAnnotation(AnnotationCompare.class);
//ObjAnnotation meta = mdb.getAnnotation(ObjAnnotation.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) {
e.printStackTrace();
log.debug("没有这个方法可显示调用");
} catch (SecurityException e) {
e.printStackTrace();
}
}
map.put("before_change", valDbMap);//更改前
map.put("after_change", valNewMap);//更改后
return map;
}
public static void main(String[] args) {
DoctorEntity d1=new DoctorEntity();
d1.setCompanyName("程序");
d1.setName("淘宝");
DoctorEntity d2=new DoctorEntity();
d2.setCompanyName("程序");
d2.setName("微信");
Map<String, Map<String, String>> map=compile(d1,d2);
System.out.println(map);
//{before_change={名字=微信}, after_change={名字=淘宝}}
}
}
后面提供注解类,这里比较简单,其实不想写的,但是为了方便需要的人还是提供自定义的注解类:
在我们需要比较的类的方法上面添加@AnnotationCompare(annotation="注释")
/**
* @description:
* @create: 2021-11-11 14:22
*/
@Target({ElementType.METHOD,ElementType.FIELD})
@Retention(RetentionPolicy.RUNTIME)
public @interface AnnotationCompare {
public String annotation();
}
分享到:
相关推荐
在给定的标题"Java Bean 遍历和使用注解给Bean的属性添加属性值"中,我们可以深入探讨两个主要主题:Java Bean的遍历和注解的应用。 1. **Java Bean遍历**: - **反射机制**:遍历Java Bean通常涉及使用Java的反射...
这些Demo旨在帮助学习者深入理解Java注解和反射的原理与应用,通过实际操作加深对这两个概念的认识,提高开发能力。在学习过程中,结合B站狂神的讲解,能够更有效地掌握这些高级特性,为日后的项目开发打下坚实的...
在Java Web开发中,Servlet和注解是两个重要的概念,它们极大地简化了代码编写和管理。本示例“servlet反射注解例子”旨在帮助我们深入理解如何将这两种技术结合使用,以实现更加灵活和可维护的服务器端应用程序。...
当注解与反射结合时,我们可以利用反射机制来读取和处理注解中的信息。在Java中,`AnnotatedElement`接口提供了获取注解的方法,包括`getAnnotations()`和`getAnnotation(Class<T> annotationClass)`。 1. `...
在Java编程中,注解(Annotations)和反射(Reflection)是两种强大的工具,它们在处理各种任务时提供了灵活性和便利性。在这个特定的场景中,我们讨论的是如何结合这两种技术来实现Excel文件的读写操作。Excel文件...
`Type`对象提供了各种方法来访问和操作类型的信息,其中`GetProperties()`和`GetFields()`是两个重要的方法。`GetProperties()`用于获取类型的所有公共属性,而`GetFields()`则用于获取所有公共字段。但通常,在面向...
- 注解处理分为两个阶段:简单处理(Round 1)和完整处理(Round 2+)。 - 在简单处理阶段,处理器只能访问其他注解,而在完整处理阶段,它们可以访问生成的类文件。 6. **运行时保留与编译时保留** - `...
通过如 Javadoc 一样的工具,可以从注解中提取信息来生成代码的文档,提高代码的可读性和维护性。 - **代码分析**: 注解可以用于工具(如 IDE、静态分析工具)分析代码,例如检测潜在的问题、进行代码质量检查或...
在Java编程中,反射(Reflection)和注解(Annotation)是两种非常强大的工具,它们能够帮助我们实现一些高级的功能。本篇文章将详细讲解如何利用反射和注解将数据导出到Excel文件中。 首先,我们要了解反射的概念...
Java中的反射(Reflect)是Java语言的一个重要特性,它允许运行时访问类的信息,包括类名、属性、方法等,并可以动态地创建对象和调用方法。反射在很多场景下非常有用,比如在框架开发、插件系统、元数据驱动编程等...
在Java编程语言中,注解(Annotation)和反射(Reflection)是两个强大的工具,它们能够帮助开发者实现高级功能,如元编程和动态行为控制。在本篇中,我们将深入探讨如何利用注解和反射来生成SQL语句,这对于构建...
在Java编程语言中,注解(Annotation)和反射(Reflection)是两个强大的特性,它们极大地扩展了代码的可读性和动态性。注解是一种元数据,可以为编译器、工具或运行时系统提供信息,而反射则允许程序在运行时检查类...
在Java编程语言中,反射和注解是两个非常重要的特性,它们极大地增强了代码的灵活性和元数据的使用。本文将深入探讨这两个概念的原理及应用方法。 反射(Reflection)是Java提供的一种强大的机制,允许程序在运行时...
Java注解(Annotation)和反射(Reflection)是Java语言中的两个高级特性,它们的结合使用在开发中提供了强大的功能和灵活性。注解是一种元数据的形式,用于提供有关程序的数据,但不直接影响程序的操作。反射则是一...
在Java中,反射主要用于在运行时分析类和对象,包括获取类的信息、创建对象、调用方法以及访问和修改字段值。这种能力在处理动态类型、元编程以及框架和库的设计中尤其有用。本话题将深入探讨如何利用Java反射机制将...
4. 动态执行:可能还会展示如何通过反射动态调用方法,创建和初始化对象,以及访问和修改属性值。 这个案例将帮助你了解如何在实际项目中结合使用反射和自定义特性,以实现更灵活、可扩展的代码设计。例如,自定义...
接着检查该方法是否被`@Authority`注解标记,如果是,则读取注解中的`action`和`privilege`属性值,并根据这些信息进行权限检查。 **2. 用户权限验证** `checkUserPrivilege`方法用于验证当前用户是否具有执行操作...
在提供的部分内容中,我们看到两个反射的案例: 1. **反射的第一个案例**: 这个例子展示了如何使用反射来获取类`bean.test`的所有方法。通过`Class.forName()`方法加载类,然后使用`getDeclaredMethods()`获取类...
3. **实例化与初始化**:使用反射调用无参构造函数创建Bean实例,然后根据Bean的元数据设置属性值,这通常通过`set`方法完成。 4. **生命周期管理**:Ioc容器可能会提供初始化和销毁方法的调用,以支持Bean的生命...