java通过类的反射获取页面修改字段前后值以及字段名称

   public void saveChangeVolue(Object before, Object after,String log) {
		StringBuffer alterContent=new StringBuffer();
		//before和after都不为空时  --属性变化
		try {
			if (before != null && after != null) {
		    //获取class字节码
			Class<?> classBefor = before.getClass();
			Class<?> classAfter = after.getClass();
			//获取所有属性
			Field[] fsBefor = classBefor.getDeclaredFields();
			Field[] fsAfter = classAfter.getDeclaredFields();
			//获取类名
			String typeName = getClassName(after.getClass().getName());
			for (Field bField : fsBefor) {
				//设置对象中成员 属性private为可读
				bField.setAccessible(true);
				for (Field aField : fsAfter) {
					aField.setAccessible(true);
                    Id id = aField.getAnnotation(Id.class);
                    //临时解决。后期再改。。
                    if(StringUtils.equals(bField.getName(),"serialVersionUID")){
                    	continue;
                    }
                    PropertyDescriptor bpd = new PropertyDescriptor(bField.getName(), classBefor);
					if (StringUtils.equals(bField.getName(), aField.getName()) && id == null) {
						// 获得属性值
						Method bmethod = bpd.getReadMethod();
						//构建一个属性描述器 把对应属性 propertyName 的 get 和 set 方法保存到属性描述器中  
						PropertyDescriptor apd = new PropertyDescriptor(aField.getName(), classAfter);
						//从属性描述器中获取 get 方法  
						Method amethod = apd.getReadMethod();
						// 获得属性类型
						if (bField.getGenericType().toString().equals("class java.lang.String")
								&& aField.getGenericType().toString().equals("class java.lang.String")) {
							// 比较对象前后的属性值时候不相同
							if (!StringUtils.equals(((String) bmethod.invoke(before)),
									((String) amethod.invoke(after)))) {
								DataChangeRecord dto = new DataChangeRecord();
								// 判断转换前后值都为null或空时,不需要记录变更数据
                                if(StringUtils.isNotBlank((String) bmethod.invoke(before))||StringUtils.isNotBlank((String) amethod.invoke(after))){
								//记录到需要保存的表中,如记录表
                                        aField.getName()//字段名
    								//修改的字段
    								if (StringUtil.isNotEmpty(converMap.get(aField.getName()))) {
    									alterContent.append("编辑"+converMap.get(aField.getName())+','+(String) bmethod.invoke(before)+"为"+(String) amethod.invoke(after));
									}
    								
    								behaviorDto.setBehavDesc(alterContent.toString());
    								//dto.setOperateType(operateStatus);
    								dto.setDataId(behaviorDto.getDataId());
    								
    								dto.setParentDataId(behaviorDto.getFileEntityId());
    								dto.setChangeType("1");
    								dataChangeRecords.add(dto);
                                }
							}
						}else if(bField.getGenericType().toString().equals("class java.math.BigDecimal")){
							if (!StringUtils.equals(String.valueOf(bmethod.invoke(before)),
									String.valueOf(amethod.invoke(after)))) {
								// 判断转换前后值都为null或空时,不需要记录变更数据
                                if(bmethod.invoke(before)!=null||amethod.invoke(after)!=null){
								/ /实体
                                	
                                	if(bmethod.invoke(before)!=null){
                                		dto.setBeforeUpdateValue(((BigDecimal)bmethod.invoke(before)).toPlainString());
                                		alterContent.append("编辑"+converMap.get(aField.getName())+','+((BigDecimal)bmethod.invoke(before)).toPlainString());
                                	}
                                	
                                	if (bmethod.invoke(before)!=null && amethod.invoke(after)!=null) {
										alterContent.append("为"+((BigDecimal)amethod.invoke(after)).toPlainString());
									}
    								//保存数据到数据库
    						       //TODO
                                }
								
							}
						} else {
							if (!StringUtils.equals(String.valueOf(bmethod.invoke(before)),
									String.valueOf(amethod.invoke(after)))) {
								// 判断转换前后值都为null或空时,不需要记录变更数据
                                if(bmethod.invoke(before)!=null||amethod.invoke(after)!=null){
                                	DataChangeRecord dto = new DataChangeRecord();
                                	
                                	if(bmethod.invoke(before)!=null){
                                		dto.setBeforeUpdateValue(String.valueOf(bmethod.invoke(before)));
                                		//修改的字段
                                		alterContent.append("编辑"+converMap.get(aField.getName())+','+String.valueOf(bmethod.invoke(before)));
                                	}
                                	if (bmethod.invoke(before)!=null && amethod.invoke(after)!=null) {
										alterContent.append("为"+String.valueOf(amethod.invoke(after)));
									}
    								
    								//保存数据到数据库
    						       //TODO
                                }
								
							}
						}
					}
				}
			}
		//before为null,after不为null  --新增
		} else if (after != null && before == null) {
			Class<?> classAfter = after.getClass();
			Field[] fsAfter = classAfter.getDeclaredFields();
			String typeName = getClassName(after.getClass().getName());
			for (Field aField : fsAfter) {
				aField.setAccessible(true);
				Id id = aField.getAnnotation(Id.class);
				PropertyDescriptor apd = new PropertyDescriptor(aField.getName(), classAfter);
				Method amethod = apd.getReadMethod();
				if (aField.getGenericType().toString().equals("class java.lang.String") && id == null) {
					// 判断转换前后值都为null或空时,不需要记录变更数据
                    if(StringUtils.isNotBlank((String) amethod.invoke(after))){
                    	DataChangeRecord dto = new DataChangeRecord();
    					// 是否是字典属性,是:保存字典对应的名称
    					dto.setAfterUpdateValue((String) amethod.invoke(after));
    					dto.setTableName(typeName);
    					dto.setColumnName(aField.getName());
    					//dto.setOperateType(operateStatus);
    					dto.setDataId(behaviorDto.getDataId());
    					dto.setParentDataId(behaviorDto.getFileEntityId());
    					dto.setChangeType("2");
    					dataChangeRecords.add(dto);
                    }
				}else if(aField.getGenericType().toString().equals("class java.math.BigDecimal") && id == null){
					// 判断转换前后值都为null或空时,不需要记录变更数据
                    if(amethod.invoke(after)!=null){
						//保存数据到数据库
    						       //TODO
                    }
                   	
				} else if (id == null) {
					// 判断转换前后值都为null或空时,不需要记录变更数据
                    if(StringUtils.isNotBlank(String.valueOf(amethod.invoke(after)))){
						//保存数据到数据库
    						       //TODO
                    }
				}
			}
		//before不为null,after为null --删除
		} else if (after == null && before != null) {
			Class<?> classBefore = before.getClass();
			Field[] fsBefore = classBefore.getDeclaredFields();
			String typeName = getClassName(before.getClass().getName());
			for (Field bField : fsBefore) {
				bField.setAccessible(true);
				Id id = bField.getAnnotation(Id.class);
				PropertyDescriptor bpd = new PropertyDescriptor(bField.getName(), classBefore);
				Method bmethod = bpd.getReadMethod();
				if (bField.getGenericType().toString().equals("class java.lang.String") && id == null) {
					if(StringUtils.isNotBlank((String) bmethod.invoke(before))){
					
						//保存数据到数据库
    						       //TODO
					}
				}else if(bField.getGenericType().toString().equals("class java.math.BigDecimal") && id == null){
					// 判断转换前后值都为null或空时,不需要记录变更数据
                    if(bmethod.invoke(before)!=null){
						//保存数据到数据库
    						       //TODO
                    }
				} else if (id == null) {
					// 判断转换前后值都为null或空时,不需要记录变更数据
                    if(StringUtils.isNotBlank(String.valueOf(bmethod.invoke(before)))){
						//保存数据到数据库
    						       //TODO
                    }
				}
			}
		}
		} catch (Exception e) {
			e.printStackTrace();
		}
		/**
		 * 插入数据库操作
		 */

	if(dataChangeRecords.size()>0){
		Field afterField=null;
		Field beforeField=null;
	 try{
			afterField = after.getClass().getDeclaredField("objectid");
		    afterField.setAccessible(true);
			beforeField=before.getClass().getDeclaredField("objectid");
	        beforeField.setAccessible(true);

		if(StringUtils.equals(afterField.get(after).toString(), beforeField.get(before).toString())){
			 insertBehavior(behaviorDto,userInfo);
		}
		} catch (Exception e) {
			e.printStackTrace();
		}
		
	
	
	}
	
}

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
你可以使用 Java反射机制来获取某个字段上的注解,并修改注解中的某个属性。下面是一个示例代码: ```java import java.lang.annotation.Annotation; import java.lang.reflect.Field; public class Main { public static void main(String[] args) throws NoSuchFieldException { // 获取字段上的注解 Field field = MyClass.class.getDeclaredField("myField"); MyAnnotation annotation = field.getAnnotation(MyAnnotation.class); // 修改注解中的属性 if (annotation != null) { System.out.println("Before modification: " + annotation.value()); modifyAnnotationValue(annotation, "new value"); System.out.println("After modification: " + annotation.value()); } } public static void modifyAnnotationValue(MyAnnotation annotation, String newValue) { try { // 获取注解的属性 Field valueField = annotation.getClass().getDeclaredField("value"); valueField.setAccessible(true); // 修改属性 valueField.set(annotation, newValue); } catch (NoSuchFieldException | IllegalAccessException e) { e.printStackTrace(); } } } @MyAnnotation("old value") class MyClass { @MyAnnotation("old value") private String myField; } @interface MyAnnotation { String value(); } ``` 在上面的例子中,我们定义了一个自定义注解 `MyAnnotation`,并将其应用到了 `MyClass` 字段 `myField` 上。通过反射,我们可以获取字段上的注解,并通过修改注解中的属性修改注解。 请注意,反射操作需要谨慎使用,并且可能会影响代码的可读性和性能。在实际开发中,建议慎重使用反射,并考虑其他替代方案。
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值