Запись изменений атрибутов объекта с использованием принципа отражения

Java задняя часть Технологии Nuggets призывают к публикации
Запись изменений атрибутов объекта с использованием принципа отражения

Эта статья участвовала в приказе о созыве Haowen, нажмите, чтобы просмотреть:Двойные заявки на внутреннюю и внешнюю стороны, призовой фонд в 20 000 юаней ждет вас, чтобы бросить вызов!

предисловие

В процессе разработки ведение журнала часто является неотъемлемой частью системы, которую можно условно разделить на два случая: первый — это системный журнал, который аналогичен журналу входа в систему, журналу вызовов интерфейса и т. д. Этот тип журнала в основном используется для записи системного журнала.Ситуация доступа и ситуация вызова метода интерфейса в основном используются разработчиками, что может быть реализовано через аннотацию, совмещенную с принципом аоп, через сканирование заданного метода и добавление правил, какие аннотации в начало метода записывается в журнал; во-вторых, это бизнес-журнал, который в основном используется для записи некоторых бизнес-изменений или изменений атрибутов в системе, таких как изменение статуса записи или изменение атрибутов объекта в процесс бизнес-потока Записи операций, в основном используемые системными операторами.

задний план

На основе записи бизнес-журнала в реальном сценарии разработки в этой статье кратко объясняется процесс использования принципа отражения Java для записи изменения атрибута, когда системный оператор изменяет атрибуты объекта.Основной процесс кода разделен на 3 основных этапа. : объявить пользовательские аннотации, ссылки на классы сущностей, тесты методов. Без лишних слов, посмотрите на код:

1. Объявите пользовательские аннотации

@Target(ElementType.FIELD)
@Retention(RetentionPolicy.RUNTIME)
public @interface FieldChangeConfig {

    public String change();
}

2. Ссылка на класс сущностей

public class StationEntity {

	private String stationId; //id
	private String stationNo; // 油站编号
	@FieldChangeConfig(change="名称变化")
	private String stationName; // 油站名称
	@FieldChangeConfig(change="地址变化")
	private String stationAddr; // 油站地址
	private String stationLeader; //负责人id
	private String leaderName; // 负责人名称
	private String stationTel; // 联系方式
	private String maintainerNo; // 维修承包商编号
	private String maintainerNames; // 维修承包商名称

        此处省略属性的set、get方法
}

3. Тестирование метода

public static void main(String[] args) throws IllegalArgumentException, IntrospectionException, IllegalAccessException, InvocationTargetException{
        StationEntity a1 = new StationEntity();
        a1.setStationName("油站1");
        a1.setStationAddr("地址1");

        StationEntity a2 = new StationEntity();
        a2.setStationName("油站2");
        a2.setStationAddr("地址2");

        Map<String, List<Object>> map = getFieldChange(a1, a2,StationEntity.class);
        String modifyContent = "";
        if(!map.isEmpty()){

            for(String s : map.keySet()){
                System.out.println(s+":" + map.get(s).get(0)+"-"+map.get(s).get(1));
                modifyContent +=  s + ":" + map.get(s).get(0)+"-"+map.get(s).get(1) +"; ";
            }
        }
        System.out.println("修改内容:" + modifyContent);

    }
    
    public static Map<String, List<Object>> getFieldChange(Object a1, Object a2,Class clazz) throws IntrospectionException, IllegalArgumentException, IllegalAccessException, InvocationTargetException {
        Map<String, List<Object>> map = new HashMap<String, List<Object>>();
        //获取当前类的实例域(即所有属性)
        Field[] fields = clazz.getDeclaredFields();
        for(Field f : fields){
            //循环属性信息,获取该实例域上的注解
            FieldChangeConfig annotation = f.getAnnotation(FieldChangeConfig.class);
            if(annotation == null){
                continue;
            }
            //获取注解中的内容
            String change = annotation.change();
            //使用javeBean PropertyDescriptor类型 获取bean的get方法
            PropertyDescriptor pd = new PropertyDescriptor(f.getName(), clazz);
            //获取get方法
            Method readMethod = pd.getReadMethod();
            Object o1 = readMethod.invoke(a1);//实体对象1的属性
            Object o2 = readMethod.invoke(a2);//实体对象2的属性
            
            //比较属性信息并将信息的变化以list的形式放入map中,main方法测试时从map中取值并拼接
            if(o1==null && o2==null){
                continue;
            }
            if(o1==null || o2 ==null){
                List<Object> list = new ArrayList<Object>();
                list.add(o1);
                list.add(o2);
                map.put(change, list);
                continue;
            }

            if(!o1.equals(o2)){
                List<Object> list = new ArrayList<Object>();
                list.add(o1);
                list.add(o2);
                map.put(change, list);
                continue;
            }
        }
        return map;
    }

4. Отображение результатов

微信图片_20210705223618.jpg

Что ж, эта статья полезна для вас? Если вы удовлетворены, не забудьте поставить редактору большой палец вверх. Ваше одобрение и симпатия являются самой большой мотивацией для постоянного выпуска редактора.