反射用法-动态注入-可配合mybatis 自动填充创建人 创建时间 修改人 修改时间 等字段

是否好奇 为何一些mybatis可以动态帮我们插入 创建时间 修改时间 登陆人 等等信息

其实很简单 mybatis替我们准备好了做插件的拦截功能 针对mybatis四大对象都可以做拦截

应为mybatis拦截过于理论 就不再这里展开讲了

下面代码为 针对拦截到的对象 怎么进行动态注入

/**
 * 思路?
 * 通过获取对象 能得到对象及其父类的所有字段
 * 能通过反射修改私有字段
 * 实现动态更改字段 也就是数据运行时的自动填充功能
 *
 * 通过mybatis拦截器 我们可以通过对四大对象的触发拦截 获取数据对象 然后利用如下方法进行注入名称
 * (拦截器的设置不过多解释 根据需求自己上网查找配置即可)
 */
public class Test {
    public static void main(String[] args) throws IllegalAccessException {
        A target = new A();
        Class<?> aClass = target.getClass();

        // 获取A 和 A的父类 所有的字段 Declared私有字段也能获取
        List<Field> list = new ArrayList<>();
        while (aClass != null){
            list.addAll(new ArrayList<>(Arrays.asList(aClass.getDeclaredFields())));
            aClass = aClass.getSuperclass();
        }

        // 字段数组转换为列表
        Field[] fields = new Field[list.size()];
        list.toArray(fields);

        for (Field field : fields) {
            String name = field.getName();
            if (StrUtil.equals(name, "name")){
                field.setAccessible(true);
                // get() 获取当前字段对象 在参数对象 匹配字段的值
                Object localFieldVal = field.get(target);
                field.setAccessible(false);

                // 证明对象该字段此时并没有值
                if (ObjectUtil.isEmpty(localFieldVal) || "".equals(localFieldVal)){
                    field.setAccessible(true);
                    field.set(target, "测试注入名称成功");
                    field.setAccessible(false);
                }
            }
        }
        System.out.println(target);
    }
}

@Data
@ToString
class A extends B {
    private String name;
    private String age;
}

@Data
class B {
    private String helen;
}

版权声明:本文为m0_46202521原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。