通过泛型和反射 记录对象前后修改的内容并改成json格式

public class BeanChangeUtil<T> {

    public void contrastObj(Object oldBean, Object newBean,StringBuilder before, StringBuilder later) {
        // 转换为传入的泛型T
        T pojo1 = (T) oldBean;
        T pojo2 = (T) newBean;
        // 通过反射获取类的Class对象
        Class clazz = pojo1.getClass();
        // 获取类型及字段属性
        Field[] fields = clazz.getDeclaredFields();
        jdk8OrAfter(fields, pojo1, pojo2, before,later,clazz);
     }
    public class BeanChangeUtil<T> {

    public void contrastObj(Object oldBean, Object newBean,StringBuilder before, StringBuilder later) {
        // 转换为传入的泛型T
        T pojo1 = (T) oldBean;
        T pojo2 = (T) newBean;
        // 通过反射获取类的Class对象
        Class clazz = pojo1.getClass();
        // 获取类型及字段属性
        Field[] fields = clazz.getDeclaredFields();
        jdk8OrAfter(fields, pojo1, pojo2, before,later,clazz);
     }
  // lambda表达式,表达式内部的变量都是final修饰,需要传入需要传入final类型的数组
    public void jdk8OrAfter(Field[] fields, T pojo1, T pojo2, StringBuilder before,StringBuilder later, Class clazz){
        final int[] i = {1};
        before.append("[");
        later.append("[");
        Arrays.asList(fields).forEach(f -> {
            if(f.isAnnotationPresent(PropertyMsg.class)){
                try {
                    PropertyDescriptor pd = new PropertyDescriptor(f.getName(), clazz);
                    // 获取对应属性值
                    Method getMethod = pd.getReadMethod();
                    Object o1 = getMethod.invoke(pojo1);
                    Object o2 = getMethod.invoke(pojo2);
                    System.out.println("222");
                    if (o1 != null && o2 != null) {
                        if (!o1.toString().equals(o2.toString())) {
                            if(StringUtil.isNotEmpty(before.toString()) && !before.toString().equals("[")){
                                before.append(",");
                            }
                            if(StringUtil.isNotEmpty(later.toString())&& !later.toString().equals("[")){
                                later.append(",");
                            }
                            before.append("{ \"key\":" + "\""+ f.getAnnotation(PropertyMsg.class).value() + "\"," + "\"value\":" + "\""+ o1 + "\"}" );
                            later.append("{ \"key\":" + "\""+ f.getAnnotation(PropertyMsg.class).value() + "\"," + "\"value\":" + "\""+ o2 + "\"}" );
                        }
                    }
                    if(o1 == null && o2 != null){
                        if(StringUtil.isNotEmpty(later.toString())&& !later.toString().equals("[")){
                            later.append(",");
                        }
                        later.append("{ \"key\":" + "\""+ f.getAnnotation(PropertyMsg.class).value() + "\"," + "\"value\":" + "\""+ o2 + "\"}" );
                    }
                }catch (Exception e){
                    e.printStackTrace();
                }
            }
        });
        before.append("]");
        later.append("]");
    }
@Target(ElementType.FIELD)
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Inherited
public @interface PropertyMsg {
    String value();
}
@Getter
@Setter
@NoArgsConstructor
@AllArgsConstructor
public class TestChange {

    private String id;

    @PropertyMsg("年龄")
    private Integer age;

    @PropertyMsg("姓名")
    private String name;
}
    @Test
    public  void test(){
        TestChange u1 = new TestChange("1", 30,"张三");
        TestChange u2 = new TestChange("2", 20,"张三丰");
        StringBuilder before = new StringBuilder();;
        StringBuilder later = new StringBuilder();;
        BeanChangeUtil<TestChange> t = new BeanChangeUtil<>();
        t.contrastObj(u1, u2,before,later);
        System.out.println(before);
        System.out.println(later);
    }
[{ "key":"年龄","value":"30"},{ "key":"姓名","value":"张三"}]
[{ "key":"年龄","value":"20"},{ "key":"姓名","value":"张三丰"}]
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值