自定义属性监控器的步骤如下:
- 创建一个监视器实例monitor
- 创建Person实例,并将监视器实例赋值给Person实例的monitor属性
- 修改Person实例的name属性或者age属性的时候会触发monitor监控器里面的recorchange方法
- 在recorchange方法里面记录哪个类哪个属性发生了值变动
- 打印结果
以下是自定义监控器的一个基本示例:
import javafx.application.Application;
import javafx.stage.Stage;
import java.io.IOException;
import java.lang.reflect.Field;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import java.text.SimpleDateFormat;
import java.util.*;public class HelloApplication {public static void main(String[] args) {// 创建监控器实例Monitor monitor = new Monitor();// 创建Person实例Person person1 = new Person();person1.monitor = monitor; // 将监控器实例赋值给Person实例的monitor属性person1.setName("张三"); // 设置Person实例的name属性person1.setAge(18); // 设置Person实例的age属性System.out.println(person1); // 打印Person实例的信息System.out.println("hello world2"); // 打印字符串}
}/*** Person类,表示一个人,包含姓名和年龄属性。*/
class Person {public Monitor monitor; // 监控器实例private String name; // 姓名private Integer age; // 年龄public Person() {}public Person(String name, Integer age) {this.name = name;this.age = age;}/*** 设置姓名属性,并记录属性变化。** @param value 新的姓名值*/public void setName(String value) {this.name = value;this.recordChange("name");}public String getName() {return this.name;}/*** 设置年龄属性,并记录属性变化。** @param value 新的年龄值*/public void setAge(Integer value) {this.age = value;this.recordChange("age");}public Integer getAge() {return this.age;}/*** 记录属性变化。** @param property 变化的属性名称*/public void recordChange(String property) {monitor.recordChange(this, property);}
}/*** Monitor类,用于监控对象的属性变化。*/
class Monitor<T> {public Map<Long, Map<String, ArrayList<Object>>> records; // 记录数据/*** 记录属性变化。** @param entity 变化的对象* @param property 变化的属性名称*/public void recordChange(T entity, String property) {// 记录时间long time = 1712906706000L;ArrayList<Object> list = new ArrayList<>();list.add(entity);Map<String, ArrayList<Object>> data = new HashMap<>();data.put("Monitor1", list);if (records == null) {records = new HashMap<>();}records.put(time, data);// 打印属性变化信息System.out.println("Property " + property + " of " + entity + " has changed.");// 获取并打印对象的属性值Object name = Util.getFieldValue(records.get(1712906706000L).get("Monitor1").get(0), "name");Object age = Util.getFieldValue(entity, "age");System.out.println("name:" + name + " ;age: " + age);}/*** Util工具类,提供获取对象字段值的方法。*/public static class Util {/*** 获取对象的字段值。** @param object 对象实例* @param fieldName 字段名称* @return 字段值*/public static Object getFieldValue(Object object, String fieldName) {try {// 获取对象的类信息Class<?> clazz = object.getClass();clazz.getName();// 获取字段对象Field field = clazz.getDeclaredField(fieldName);// 确保字段可访问field.setAccessible(true);// 获取字段值return field.get(object);} catch (NoSuchFieldException | IllegalAccessException e) {e.printStackTrace();}return null;}}
}