Java反射—记录两个对象之间属性值的变化

这篇博客介绍了如何利用Java反射来追踪并记录两个对象之间的属性值变化,常见应用场景包括前端对象与数据库对象的属性校验及记录对象属性修改日志。

 学习笔记——输出公共方法——方便使用

 使用场景:

        1、前台对象传递到后台与现有DB对象之间属性值的校验。

        2、字段较多的对象需要保留属性修改的日志记录。

    public StringBuffer createUpdateLogContent(Object dbData, Object pageData) {
        try {
            StringBuffer buffer = new StringBuffer();
            // 将对象赋值到新的实体中,减少字段的使用
            Object dbE = new Object();
            BeanUtils.copyProperties(dbData, dbE);
            Object pageE = new Object();
            //拷贝对象
            BeanUtils.copyProperties(pageData, pageE);
            // 获取所有数据库属性
            Field[] dbFields = dbE.getClass().getDeclaredFields();
            //存储key:属性名,value:属性值
            Map<String, String> dbNameAndValueMap = new LinkedHashMap<String, String>();
            //遍历所有属性,生成Map
            for (Field field : dbFields) {
                // 解除私有限定
                field.setAccessible(true);
   
Java中比较两个对象属性值,有以下几种常见方法: ### 手动逐个属性比较 对于属性较少的对象,可以手动逐个属性进行比较。例如: ```java class Person { private String name; private int age; public Person(String name, int age) { this.name = name; this.age = age; } public String getName() { return name; } public int getAge() { return age; } } public class ManualComparison { public static boolean comparePersons(Person p1, Person p2) { return p1.getName().equals(p2.getName()) && p1.getAge() == p2.getAge(); } public static void main(String[] args) { Person p1 = new Person("Alice", 25); Person p2 = new Person("Alice", 25); System.out.println(comparePersons(p1, p2)); } } ``` 这种方法简单直接,但当对象属性较多时,代码会变得冗长,且缺乏通用性[^1]。 ### 重写equals方法 重写对象类的`equals`方法,在其中定义属性比较逻辑。示例如下: ```java import java.util.Objects; class Point { private int x; private int y; public Point(int x, int y) { this.x = x; this.y = y; } @Override public boolean equals(Object o) { if (this == o) return true; if (o == null || getClass() != o.getClass()) return false; Point point = (Point) o; return x == point.x && y == point.y; } @Override public int hashCode() { return Objects.hash(x, y); } } public class EqualsComparison { public static void main(String[] args) { Point p1 = new Point(1, 2); Point p2 = new Point(1, 2); System.out.println(p1.equals(p2)); } } ``` 重写`equals`方法时,通常也需要重写`hashCode`方法,以确保对象在哈希集合(如`HashSet`、`HashMap`)中的正确使用[^2]。 ### 使用反射 利用Java反射机制,可以动态获取对象的属性并进行比较。示例代码如下: ```java import java.lang.reflect.Field; class Employee { private String name; private int id; public Employee(String name, int id) { this.name = name; this.id = id; } } public class ReflectionComparison { public static boolean compareObjects(Object obj1, Object obj2) throws IllegalAccessException { if (obj1 == null || obj2 == null) { return obj1 == obj2; } if (obj1.getClass() != obj2.getClass()) { return false; } Class<?> clazz = obj1.getClass(); Field[] fields = clazz.getDeclaredFields(); for (Field field : fields) { field.setAccessible(true); Object value1 = field.get(obj1); Object value2 = field.get(obj2); if (value1 == null) { if (value2 != null) { return false; } } else if (!value1.equals(value2)) { return false; } } return true; } public static void main(String[] args) throws IllegalAccessException { Employee e1 = new Employee("Bob", 101); Employee e2 = new Employee("Bob", 101); System.out.println(compareObjects(e1, e2)); } } ``` 反射方法可以处理任意对象,具有较好的通用性,但反射操作会带来一定的性能开销。 ### 使用第三方库 如Apache Commons Lang库中的`EqualsBuilder`类,可以简化对象属性比较的代码。示例如下: ```java import org.apache.commons.lang3.builder.EqualsBuilder; class Book { private String title; private String author; public Book(String title, String author) { this.title = title; this.author = author; } @Override public boolean equals(Object obj) { if (obj == null) { return false; } if (obj == this) { return true; } if (obj.getClass() != getClass()) { return false; } Book rhs = (Book) obj; return new EqualsBuilder() .append(title, rhs.title) .append(author, rhs.author) .isEquals(); } } public class ThirdPartyLibraryComparison { public static void main(String[] args) { Book b1 = new Book("Java Programming", "John Doe"); Book b2 = new Book("Java Programming", "John Doe"); System.out.println(b1.equals(b2)); } } ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值