浅谈用java实现事件驱动机制
发布时间 - 2026-01-11 03:06:15 点击率:次由于项目需求,需要为Java提供一套支持事件驱动机制的类库,可以实现类似于C#中的event和delegate机制。众所周知,Java语言本身以及其标准库中并没有提供事件驱动机制的相关接口,虽然Swing(我且认为其不属于标准库,因为一般没人用:)中存在相关的类支持该机制以实现组件的事件处理,但它毕竟是与GUI相耦合的,而在其它类型的应用程序中使用起来显得就有些别扭,缺乏通用性。因此有必要实现一套通用的Java事件驱动机制类库,然后将其应用于通用的Java应用程序当中,虽然这并不是什么难事:)

让我们先考察一下C#的事件驱动机制编写方法。C#中提供的event关键字可以很容易的用来定义一个事件,然后通过向事件中添加事件处理函数(在C#中一般用委托(delegate)来引用一个函数),触发事件就可以调用相关的处理函数,也即是事件驱动的过程。例如:
//定义事件和对应的委托
public event MyDelegate Click;
public delegate void MyDelegate();
//定义委托
void OnClick(){
console.writeline("you just clicked me!");
}
//将委托与事件关联
Click += OnClick;
//触发事件
Click();
上面的代码就是用C#实现的事件驱动机制的一个简单的例子,可见是非常简单的,这都源于C#在语言层面(其实是CLR)提供的便利。遗憾的是Java并不提供这样的便利,需要人为去实现。下面本文将提供两种实现事件驱动机制的方法,仅供参考。
观察者模式
观察者模式是一种常用的设计模式,观察者(Observer)先通过订阅被观察对象(Subject),这样一旦被观察者(Subject)发生某种变化,就会将变化通知观察者(Observer)。
这种设计模式刚好可以用于事件驱动机制,事件(event)相当于被观察对象(Subject),一旦事件被触发,就会调用事件处理函数,可见事件处理函数(C#中的委托)可以看作是观察者。因此可以像如下这样实现上文中的功能。
/*事件类*/
public Event {
//与事件相关的事件处理函数
public ArrayList<Callback> callbackList;
//事件触发函数
public void emit(){
for(Callback cb : callbackList){
cb.run();
}
}
//注册事件处理函数
public registerCallback(Callback cb){
callbackList.add(cb);
}
}
/*事件处理函数类*/
public interface Callback {
void run();
}
public OnClick implements Callback {
//函数
public void run(){
System.out.println("you just clicked me!");
}
/*实现事件驱动*/
Event e = new Event();
//将OnClick事件处理函数注册到事件中
e.registerCallback(new OnClick());
//触发事件
e.emit();
上面的Java代码实现了一种简单的事件驱动机制,原理很简单,是一种典型的观察者模式的应用案例。
利用反射
Java语言提供强大的反射功能,可以在运行时获取类的各个组成部分(比如类名、类成员函数、类属性等等)并对其进行操作。下面使用反射来实现简单的事件驱动机制。
/*事件处理类*/
public class EventHandler {
//事件源
private Object sender;
//事件处理函数名称(用于反射)
private String callback;
public EventHandler(Object sender, String callback){
this.sender = sender;
this.callback = callback;
}
//事件触发
public void emit(){
Class senderType = this.sender.getClass();
try {
//获取并调用事件源sender的事件处理函数
Method method = senderType.getMethod(this.callback);
method.invoke(this.sender);
} catch (Exception e2) {
e2.printStackTrace();
}
}
}
/*事件源*/
public class Button(){
/*可以在此设置Button类的相关属性,比如名字等*/
private String name;
...
//事件处理函数
public void onClick(){
System.out.println("you just clicked me!");
}
}
/*实现事件驱动机制*/
Button b = new Button();
if(/*收到按钮点击信号*/){
EventHandler e = new EventHandler(b, "onClick");
e.emit();
}
上述代码展示了利用反射实现的事件驱动机制,利用反射机制的好处是其具有强大的扩展性,比如我的事件处理函数中可以引入一个EventArgs的形参,从而可以让事件本身带有参数,这样就可以让事件携带更多的信息,改写后的事件处理函数如下方的代码所示:
public class EventArgs {
//参数
String p1;
Integer p2;
...
}
//onClick事件处理函数改写
public void onClick(Object sender, EventArgs e){
//参数e提供更多的信息
System.out.println("Hello, you clicked me! " + e.p1 + e.p2);
}
//触发函数emit改写
public void emit(EventArgs e){
Class senderType = this.sender.getClass();
try {
//获取并调用事件源sender的事件处理函数
Method method = senderType.getMethod(this.callback, this.getClass(), e.getClass());
method.invoke(this.sender, this.sender, e);
} catch (Exception e2) {
e2.printStackTrace();
}
}
是不是似曾相识?没错,和用C#写Winform窗体时,Visual studio为你自动生成的事件处理函数(代码中的onClick函数)几乎具有完全相同的形式,但此时我们是用Java实现的。
当然,除了以上提到的两种方法可以实现Java的事件驱动机制以外,还有一些其它的方法,比如可以利用Java的内部类来实现,笔者也曾写过一些示例代码,这里就不再冗言了,留待以后再讲。
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。
# java事件处理机制
# java的事件处理机制
# 详解JAVA Spring 中的事件机制
# Java事件机制要素及实例详解
# Java事件监听机制讲解
# 详谈Java中的事件监听机制
# 一文带你学会Java事件机制
# 是一种
# 两种
# 可以实现
# 来实现
# 就可以
# 应用程序
# 的是
# 类库
# 就会
# 让我们
# 在此
# 为你
# 没人
# 而在
# 将其
# 很容易
# 对其
# 很简单
# 事件中
# 为其
相关栏目:
【
网站优化151355 】
【
网络推广146373 】
【
网络技术251813 】
【
AI营销90571 】
相关推荐:
网站制作大概要多少钱一个,做一个平台网站大概多少钱?
laravel怎么使用数据库工厂(Factory)生成带有关联模型的数据_laravel Factory生成关联数据方法
Laravel用户认证怎么做_Laravel Breeze脚手架快速实现登录注册功能
南京网站制作费用,南京远驱官方网站?
Laravel怎么解决跨域问题_Laravel配置CORS跨域访问
jQuery中的100个技巧汇总
如何确保西部建站助手FTP传输的安全性?
非常酷的网站设计制作软件,酷培ai教育官方网站?
如何快速搭建高效服务器建站系统?
Laravel怎么实现一对多关联查询_Laravel Eloquent模型关系定义与预加载【实战】
Thinkphp 中 distinct 的用法解析
Laravel如何使用Sanctum进行API认证?(SPA实战)
HTML5空格和nbsp有啥关系_nbsp的作用及使用场景【说明】
如何在万网利用已有域名快速建站?
如何自定义safari浏览器工具栏?个性化设置safari浏览器界面教程【技巧】
Linux虚拟化技术教程_KVMQEMU虚拟机安装与调优
微信小程序 HTTPS报错整理常见问题及解决方案
电商网站制作多少钱一个,电子商务公司的网站制作费用计入什么科目?
Laravel如何处理表单验证?(Requests代码示例)
消息称 OpenAI 正研发的神秘硬件设备或为智能笔,富士康代工
中国移动官方网站首页入口 中国移动官网网页登录
WordPress 子目录安装中正确处理脚本路径的完整指南
HTML透明颜色代码在Angular里怎么设置_Angular透明颜色使用指南【详解】
Laravel Blade组件怎么用_Laravel可复用视图组件的创建与使用
如何制作一个表白网站视频,关于勇敢表白的小标题?
Laravel如何配置.env文件管理环境变量_Laravel环境变量使用与安全管理
成都网站制作公司哪家好,四川省职工服务网是做什么用?
济南网站建设制作公司,室内设计网站一般都有哪些功能?
三星网站视频制作教程下载,三星w23网页如何全屏?
Laravel安装步骤详细教程_Laravel环境搭建指南
三星、SK海力士获美批准:可向中国出口芯片制造设备
网站制作怎么样才能赚钱,用自己的电脑做服务器架设网站有什么利弊,能赚钱吗?
Java类加载基本过程详细介绍
Laravel怎么做缓存_Laravel Cache系统提升应用速度的策略与技巧
如何快速搭建高效香港服务器网站?
Laravel如何实现本地化和多语言支持?(i18n教程)
Laravel如何处理异常和错误?(Handler示例)
如何在服务器上三步完成建站并提升流量?
Laravel Artisan命令怎么自定义_创建自己的Laravel命令行工具完全指南
Win11怎么设置默认图片查看器_Windows11照片应用关联设置
如何利用DOS批处理实现定时关机操作详解
Laravel Debugbar怎么安装_Laravel调试工具栏配置指南
python中快速进行多个字符替换的方法小结
Laravel怎么实现搜索功能_Laravel使用Eloquent实现模糊查询与多条件搜索【实例】
开心动漫网站制作软件下载,十分开心动画为何停播?
网站建设要注意的标准 促进网站用户好感度!
Laravel DB事务怎么使用_Laravel数据库事务回滚操作
php做exe能调用系统命令吗_执行cmd指令实现方式【详解】
高防服务器租用指南:配置选择与快速部署攻略
EditPlus中的正则表达式 实战(2)

