`

反射比较两个对象属性值是否有修改

    博客分类:
  • java
阅读更多
springMVC Control


@RequestMapping(value = "/save", method = RequestMethod.POST)
	public String save(RedirectAttributes redirectAttr,
			GoodsSupplierPrice gsp,
			@ModelAttribute(App.SESSION_USER_KEY) SessionUser sessionUser) {
		if (gsp.getId() == null) {
			gsp.setOperUserId(sessionUser.getUserId());
			this.goodsSupplierPriceService.save(gsp);
			operateLogService.insert("insert", "插入-采购报价SKU:"+gsp.getGoodsSku(), sessionUser.getUserId(), "采购管理", "采购报价管理");	
		} else {
			GoodsSupplierPrice gspOld = this.goodsSupplierPriceService.load(gsp.getId());
			try{
				String editMsg= CommonUtil.getEditMsg(gspOld,gsp,gsp.getClass().getName());
			    this.goodsSupplierPriceService.update(gsp);
			    operateLogService.insert("update", "更新-采购报价SKU:"+gsp.getGoodsSku()+"["+editMsg+"]", sessionUser.getUserId(), "采购管理", "采购报价管理");	
			 }catch(Exception e){
				e.printStackTrace();
			}
		}



实体对象

import java.math.BigDecimal;
import java.util.Date;

import org.springframework.format.annotation.DateTimeFormat;

import com.fasterxml.jackson.annotation.JsonFormat;
import com.xuanfeiyang.annotations.Column;

public class GoodsSupplierPrice {
	private Integer id;

	private Integer supplierId;
    
	@Column(Desc = "SKU")
	private String goodsSku;
	
	@Column(Desc = "商品名称")
	private String goodsName;
	
	@Column(Desc = "商品单位")
	private String goodsUnit;
	
	@Column(Desc = "采购量从")
	private Integer countMin;
	
	@Column(Desc = "采购量到")
	private Integer countMax;
	
	@Column(Desc = "报价")
	private BigDecimal price;

	@JsonFormat(pattern="yyyy-MM-dd", timezone="GMT+8")
	@DateTimeFormat(pattern="yyyy-MM-dd")
	private Date startDate;

	@JsonFormat(pattern="yyyy-MM-dd", timezone="GMT+8")
	@DateTimeFormat(pattern="yyyy-MM-dd")
	private Date endDate;
	
	@Column(Desc = "采购周期")
	private Short buyPeriod;
	
	@Column(Desc = "优先级")
	private Short priority;
	
	@Column(Desc = "备注")
	private String note;

	private Integer operUserId;

	private Date createdTime;

	private Date lastUpdatedTime;
	
	// 附件字段:供应商名称
	private String supplierName;
	
	// 附件字段:维护人名称
	private String operUserName;

	public String getSupplierName() {
		return supplierName;
	}

	public void setSupplierName(String supplierName) {
		this.supplierName = supplierName;
	}

	public String getOperUserName() {
		return operUserName;
	}

	public void setOperUserName(String operUserName) {
		this.operUserName = operUserName;
	}

	public Integer getId() {
		return id;
	}

	public void setId(Integer id) {
		this.id = id;
	}

	public Integer getSupplierId() {
		return supplierId;
	}

	public void setSupplierId(Integer supplierId) {
		this.supplierId = supplierId;
	}

	public String getGoodsSku() {
		return goodsSku;
	}

	public void setGoodsSku(String goodsSku) {
		this.goodsSku = goodsSku == null ? null : goodsSku.trim();
	}

	public String getGoodsName() {
		return goodsName;
	}

	public void setGoodsName(String goodsName) {
		this.goodsName = goodsName == null ? null : goodsName.trim();
	}

	public String getGoodsUnit() {
		return goodsUnit;
	}

	public void setGoodsUnit(String goodsUnit) {
		this.goodsUnit = goodsUnit == null ? null : goodsUnit.trim();
	}

	public Integer getCountMin() {
		return countMin;
	}

	public void setCountMin(Integer countMin) {
		this.countMin = countMin;
	}

	public Integer getCountMax() {
		return countMax;
	}

	public void setCountMax(Integer countMax) {
		this.countMax = countMax;
	}

	public BigDecimal getPrice() {
		return price;
	}

	public void setPrice(BigDecimal price) {
		this.price = price;
	}

	public Date getStartDate() {
		return startDate;
	}

	public void setStartDate(Date startDate) {
		this.startDate = startDate;
	}

	public Date getEndDate() {
		return endDate;
	}

	public void setEndDate(Date endDate) {
		this.endDate = endDate;
	}

	public Short getBuyPeriod() {
		return buyPeriod;
	}

	public void setBuyPeriod(Short buyPeriod) {
		this.buyPeriod = buyPeriod;
	}

	public Short getPriority() {
		return priority;
	}

	public void setPriority(Short priority) {
		this.priority = priority;
	}

	public String getNote() {
		return note;
	}

	public void setNote(String note) {
		this.note = note == null ? null : note.trim();
	}

	public Integer getOperUserId() {
		return operUserId;
	}

	public void setOperUserId(Integer operUserId) {
		this.operUserId = operUserId;
	}

	public Date getCreatedTime() {
		return createdTime;
	}

	public void setCreatedTime(Date createdTime) {
		this.createdTime = createdTime;
	}

	public Date getLastUpdatedTime() {
		return lastUpdatedTime;
	}

	public void setLastUpdatedTime(Date lastUpdatedTime) {
		this.lastUpdatedTime = lastUpdatedTime;
	}
}




工具类


/**
     * 数据修改对比统计
     * @param oldT 修改前
     * @param newT 修改后
     * @param className 类名
     * @param <T>
     * @return
     * @throws Exception
     */
    public static <T> String getEditMsg(T oldT, T newT, String className) throws Exception{
        Class onwClass = Class.forName(className);
        StringBuffer editMsg = new StringBuffer();
        Field[] fields = onwClass.getDeclaredFields();
        for (Field f : fields) {
            // 过滤 static、 final、private static final字段
            if (f.getModifiers() == 16 || f.getModifiers() == 8
                    || f.getModifiers() == 26) {
                continue;
            }
            com.xuanfeiyang.annotations.Column annotationColumn = f.getAnnotation(com.xuanfeiyang.annotations.Column.class);
            if (annotationColumn == null) {
                continue;
            }
            Object oldV = ReflectUtil.getValueMethod(oldT,f.getName(),f.getType());
            Object newV = ReflectUtil.getValueMethod(newT,f.getName(),f.getType());
            if (newV != null && !newV.equals(oldV) && StringUtils.isNotBlank(newV.toString())) {
                editMsg.append(annotationColumn.Desc() + " 从 " + oldV + "修改成" + newV + "<br>");
            }
        }
        return editMsg.toString();
    }

分享到:
评论

相关推荐

    java 利用反射将同一种对象,不同属性值,合并为一个新的对象

    在web开发中,经常遇到...而使用hibernate,它的修改是基于对象的,如果用户修改的字段非常多,但是我们并不知道用户到底修改了那个字段,这时候就需要一个一个的去判断,因此非常耗时,所以我写了个工具类来帮助大家!

    Java对象属性数据比较,返回变化数据

    `ObjectCompareUtil.java`很可能就是一个工具类,提供了静态方法来比较两个对象的属性差异。 在`ObjectCompareUtil`中,可能会有如下的核心方法: ```java public static &lt;T&gt; Map, DiffResult&gt; compareObjects(T ...

    Java 用反射设置对象的属性值实例详解

    Java 反射机制详解 - 设置对象的属性值 Java 反射机制是 Java 语言中一个非常强大的功能,它允许程序在运行时检查和修改自身的结构和行为。在这篇文章中,我们将详细介绍如何使用 Java 反射机制来设置对象的属性值...

    java反射获取一个object属性值代码解析

    java反射获取一个object属性值代码解析 java反射获取一个object属性值代码...java反射获取一个object属性值代码解析是java编程中一个非常重要的知识点,可以动态地获取一个对象的属性值,无需提前知道该对象的类型。

    Java利用反射获取object的属性和值代码示例

    4.如何使用反射机制设置对象的属性值 5.反射机制的优缺点和使用场景 6.如何处理反射机制中的异常 这篇文章展示了Java反射机制的基本概念和使用方法,并提供了一个实用的例子来展示如何使用反射机制来获取对象的属性...

    反射获取属性调用方法反射获取属性调用方法

    下面将详细解释这两个概念。 1. 反射获取属性: 在Java中,`java.lang.reflect`包提供了`Class`类来获取类的信息,包括其属性(字段)。例如,你可以通过以下步骤获取类的属性: ```java Class&lt;?&gt; clazz = ...

    JAVA反射机制动态调用 计算器对象的加法,减法函数;JAVA反射机制修改一个学生对象 的私有数据成员

    假设我们有一个`Calculator`类,其中包含`add`和`subtract`两个方法。在不直接引用`Calculator`类或其方法的情况下,我们可以使用以下步骤动态调用这些方法: - 获取`Calculator`类的`Class`对象:`Class&lt;?&gt; ...

    C#数据实体类中如何给属性赋值

    最后,我们可以输出第一个实体类的`StrTemp`属性值来验证是否成功。 ```csharp Console.WriteLine(cs[0].StrTemp); ``` #### 总结 通过上述步骤,我们已经成功地将`DataSet`中的数据映射到了实体类中。这种方法...

    Java Bean 遍历和使用注解给Bean的属性添加属性值

    在给定的标题"Java Bean 遍历和使用注解给Bean的属性添加属性值"中,我们可以深入探讨两个主要主题:Java Bean的遍历和注解的应用。 1. **Java Bean遍历**: - **反射机制**:遍历Java Bean通常涉及使用Java的反射...

    自定义属性和反射的例子

    在.NET框架中,自定义属性(Custom Attributes)是一种元数据,可以附加到代码的各种元素上,如类、方法、字段等,提供额外的信息用于运行...在实际项目中,结合这两个特性,可以有效地提高代码的可维护性和可重用性。

    java从list中取出对象并获得其属性值的方法

    以下是如何使用反射来获取`List`中对象属性值的步骤: 1. 遍历`List`:使用`for`循环遍历列表中的每一个元素。 2. 获取字段:使用`list.get(i).getClass().getDeclaredFields()`获取当前对象的所有声明的字段(包括...

    Java比较两个对象中的字段值

    用于判断修改后的实体修改了哪些内容,与原实体各个属性的值有哪些变化

    dom4j+反射,面向对象方式的xml格式转换

    我们可以创建一个User类,包含id、name和age字段,然后用DOM4J解析XML,通过反射创建User对象并设置属性。这个过程可以封装成一个通用的方法,以适应不同结构的XML数据转换。 总之,DOM4J提供了强大且易用的工具来...

    C#net反射实现访问类中的私有变量或者方法

    在上述代码中,我们定义了一个名为`ChangeValue`的类,该类包含一个私有字符串变量`myValue`和两个公共方法:构造函数和`WriteLine`方法。`Test`类中的`Main`方法则演示了如何使用反射来修改`ChangeValue`类实例中的...

    JAVA反射与代理

    动态修改查询属性值是反射的另一个关键应用。我们可以使用`getDeclaredField()`或`getField()`方法获取类的字段,然后调用`setAccessible(true)`允许访问私有字段,最后通过`set()`方法设置字段的值。同样,`get()`...

    dom4j 和java反射

    DOM4J和Java反射是Java开发中两个非常重要的技术,它们在处理XML文档和动态对象操作方面发挥着关键作用。在此,我们将深入探讨这两个概念及其在实现Bean与XML之间的转换中的应用。 首先,DOM4J是一个Java库,专门...

    Java期末复习——枚举与反射机制

    Java编程语言中,枚举和反射机制是两个重要的特性,它们在不同的场景下有着独特的用途。下面我们将详细探讨这两个主题。 一、枚举 枚举(Enum)在Java中用于定义一组固定数量的值,这些值可以作为常量使用。枚举...

    Java反射机制修改私有成员变量的实现_Reflection

    `set(Object obj, Object value)`方法接受两个参数,第一个是目标对象,第二个是要设置的新值。 在描述中提到的"普通方式无法修改私有成员变量的值,但通过反射机制可以实现",正是指的以上这一过程。这种方式虽然...

Global site tag (gtag.js) - Google Analytics