自定义属性监控器的步骤如下:
- 创建一个监视器实例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;
}
}
}