java自定义属性监听器

自定义属性监控器的步骤如下: 

  1. 创建一个监视器实例monitor
  2. 创建Person实例,并将监视器实例赋值给Person实例的monitor属性
  3. 修改Person实例的name属性或者age属性的时候会触发monitor监控器里面的recorchange方法
  4. 在recorchange方法里面记录哪个类哪个属性发生了值变动
  5. 打印结果

以下是自定义监控器的一个基本示例:

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;}}
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/387601.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

资金管理平台 -SAP创建凭证测试程序及增强!

文章目录 主要程序创建程序程序 代码解析变量定义抬头和项目初始值表头赋值调用BAPI其他的子例程 核心内表增强部分LFACIF5D程序FI_DOCUMENT_CHECK完整程序 BADI增强 主要程序 创建程序 程序 &---------------------------------------------------------------------* *…

Matplotlib面积图绘制秘籍:让你的数据‘膨胀’起来,但不吹泡泡哦!

1. 引言 嘿&#xff0c;数据迷们&#xff01;想不想让你的数据‘活’起来&#xff0c;跳一曲色彩斑斓的面积舞&#xff1f;Matplotlib面积图&#xff0c;不只是数字的堆砌&#xff0c;它是故事的讲述者&#xff0c;让复杂数据变得一目了然&#xff0c;还带点小幽默。快来一探究…

鸿蒙应用框架开发【首选项】 本地数据与文件

首选项 简介 本示例使用ohos.data.preferences接口&#xff0c;展示了使用首选项持久化存储数据的功能。 效果预览 使用说明 1.点击顶部titleBar的右侧切换按钮&#xff0c;弹出主题菜单&#xff0c;选择任意主题则切换相应的主题界面&#xff1b; 2.退出应用再重新进入&a…

C++客户端Qt开发——界面优化(美化登录界面)

美化登录界面 在.ui中拖入一个QFream&#xff0c;顶层窗口的QWidget无法设置背景图片&#xff0c;套上一层QFrame将背景图片设置到QFrame上即可 用布局管理器管理元素&#xff1a;用户名LineEdit&#xff0c;密码LineEdit&#xff0c;记住密码ComboBox&#xff0c;登录Button…

Windows本地构建镜像推送远程仓库

下载 Docker Desktop https://smartidedl.blob.core.chinacloudapi.cn/docker/20210926/Docker-win.exe 使用本地docker构建镜像和推送至远程仓库&#xff08;harbor&#xff09; 1、开启docker的2375端口 2、配置远程仓库push镜像可以通过http harbor.soujer.com:5000ps&am…

【C语言】数据类型全解析:编程效率提升的秘诀

目录 C语言数据类型详解1. 基本数据类型1.1 整型示例代码输出结果 1.2 浮点型示例代码输出结果 1.3 字符型示例代码输出结果 2. 派生数据类型2.1 数组示例代码输出结果 2.2 指针示例代码输出结果 2.3 结构体示例代码输出结果 2.4 共用体示例代码输出结果 3. 类型限定符3.1 cons…

为什么Word中正文总会变成标题?

问题 选中文字之后点击正文&#xff0c;格式总是会自动变成标题&#xff0c;然后出现在目录中&#xff0c;改不掉。 方法 是因为段落样式的大纲级别设置了标题级别 选中识别成标题的正文&#xff0c;右键选择段落&#xff0c;把大纲级别设置成正文就好。

微信小程序云开发订单微信支付与小票和标签打印的完整高效流程

一个字“全”&#xff01;&#xff01;&#xff01; 前言一、流程设定1、如何开通云支付流程2、以订单下单为例的支付流程2.1 业务场景介绍2.2 业务场景流程图 二、代码与代码文件组成1、页面JS2、云函数payPre3、支付回调函数pay_cb3.1 准备条件3.2 必要认知3.3 pay_cb 完整函…

Llama 4训练已开启!Meta科学家最新采访,揭秘Llama 3.1是如何炼成的

Llama 3.1的诞生标志着人工智能领域的一个重要里程碑&#xff0c;它不仅是Meta在大型语言模型&#xff08;LLM&#xff09;研发上的一次重大突破&#xff0c;也代表了开源AI模型在技术进步和应用潜力上的新高度。以下是对Llama 3.1的炼成过程、观点阐述以及未来发展趋势的分析。…

莫斯科的社会生态环境之一瞥

题记 社会生态&#xff0c;它是指人类随着利用科技对环境的作用所呈现出的人和人的关系&#xff0c;人和人群的关系&#xff0c;人群和环境的关系 。而生态文明的理念&#xff0c;提倡的不止是尊重自然、顺应自然、保护自然&#xff0c;也包含注重规律的和谐性、可持续性、稳定…

如何使用CANoe自带的TCP/IP Stack验证TCP的零窗口探测机制

如果想利用CANoe自带的TCP/IP协议栈验证TCP的零窗口探测机制,就必须添加一个网络节点并配置独立的CANoe TCP/IP协议栈,作为验证对象。而与它进行TCP通信的对端也是一个网络节点,但不要配置TCP/IP协议栈,而是使用CAPL代码在底层组装TCP报文模拟TCP通信过程。这样可以尽量减少…

2024年最强网络安全学习路线,详细到直接上清华的教材!

关键词&#xff1a;网络安全入门、渗透测试学习、零基础学安全、网络安全学习路线 首先咱们聊聊&#xff0c;学习网络安全方向通常会有哪些问题前排提示&#xff1a;文末有CSDN官方认证Python入门资料包 &#xff01; 1、打基础时间太长 学基础花费很长时间&#xff0c;光语…

医院体检信息管理系统,C#体检系统源码,健康体检系统PEIS

体检服务全流程 检前 检前注意事项提醒-体检预约-套餐选择-体检签到-费用缴纳 检中 科室队列提醒-增项检中支付 检后 报告查询-体检百科-报告解读-问卷调查 体检管理系统模块介绍 一、登记管理模块 登记体检者基本信息&#xff0c;包括唯一的体检编号&#xff0c;姓名、…

【Golang 面试 - 基础题】每日 5 题(八)

✍个人博客&#xff1a;Pandaconda-CSDN博客 &#x1f4e3;专栏地址&#xff1a;http://t.csdnimg.cn/UWz06 &#x1f4da;专栏简介&#xff1a;在这个专栏中&#xff0c;我将会分享 Golang 面试中常见的面试题给大家~ ❤️如果有收获的话&#xff0c;欢迎点赞&#x1f44d;收藏…

Miniconda快速安装conda

关注B站可以观看更多实战教学视频&#xff1a;hallo128的个人空间 安装官方网址&#xff1a;https://docs.anaconda.com/miniconda/#quick-command-line-install 1. Miniconda for Windows curl https://repo.anaconda.com/miniconda/Miniconda3-latest-Windows-x86_64.exe -o …

【LeetCode】56. 区间合并

区间合并 题目描述&#xff1a; 以数组 intervals 表示若干个区间的集合&#xff0c;其中单个区间为 intervals[i] [starti, endi] 。请你合并所有重叠的区间&#xff0c;并返回 一个不重叠的区间数组&#xff0c;该数组需恰好覆盖输入中的所有区间 。 示例 1&#xff1a; …

捷径,这世上有没有捷径

Q&#xff1a;大师&#xff0c;这个世界上有没有捷径&#xff1f; A&#xff1a;有呀&#xff0c;有捷径呀 Q&#xff1a;大师&#xff0c;那我要怎么走&#xff1f; A&#xff1a;你错啦&#xff0c;不要想着走捷径&#xff0c;因为捷径不是用来走的&#xff0c;捷径是用来飞的…

SNN系列论文阅读:梦开始的地方

论文地址:https://igi-web.tugraz.at/people/maass/psfiles/85a.pdf 1. nn分类 一开始论文将nn分为三类, 1. 最初的MP多层感知机 2. 加入非线性激活, 并可以反向传播训练的神经网络 3. SNN 注意分类不是普通的fc网络,rnn网络和snn网络 2. 理解脉冲 LIF模型,全称Leak…

CUDA_Occupancy_Calculator计算公式

CUDA_Occupancy_Calculator计算公式

【设计模式:单例模式】

单例模式的特点&#xff1a; 单例类只允许一个实例单例类必须自己创造自己的唯一实例单例类必须给所有其他对象提供这一实例 单例模式底层如何实现&#xff1a; 私有化构造函数&#xff0c;类外部无法创造类对象&#xff0c;实现了单例类只允许有一个实例对象的特点类定义中含有…