Java学习者论坛

 找回密码
 立即注册

QQ登录

只需一步,快速开始

手机号码,快捷登录

恭喜Java学习者论坛(https://www.javaxxz.com)已经为数万Java学习者服务超过8年了!积累会员资料超过10000G+
成为本站VIP会员,下载本站10000G+会员资源,购买链接:点击进入购买VIP会员
JAVA高级面试进阶视频教程Java架构师系统进阶VIP课程

分布式高可用全栈开发微服务教程

Go语言视频零基础入门到精通

Java架构师3期(课件+源码)

Java开发全终端实战租房项目视频教程

SpringBoot2.X入门到高级使用教程

大数据培训第六期全套视频教程

深度学习(CNN RNN GAN)算法原理

Java亿级流量电商系统视频教程

互联网架构师视频教程

年薪50万Spark2.0从入门到精通

年薪50万!人工智能学习路线教程

年薪50万!大数据从入门到精通学习路线年薪50万!机器学习入门到精通视频教程
仿小米商城类app和小程序视频教程深度学习数据分析基础到实战最新黑马javaEE2.1就业课程从 0到JVM实战高手教程 MySQL入门到精通教程
查看: 260|回复: 0

[Java反射学习]用反射实现委托器

[复制链接]
  • TA的每日心情
    开心
    2021-3-12 23:18
  • 签到天数: 2 天

    [LV.1]初来乍到

    发表于 2014-10-30 23:58:05 | 显示全部楼层 |阅读模式
    学习过java Swing的读者一定对于Swing中相对较为复杂的事件驱动模型比较困惑,虽然事件驱动模型在Java Swing中被完完全全的体现出来了,但是对于一个软件初学者而言这样的事件驱动模型确实是很难理解的。

        同样是事件驱动模型的.Net框架就进行了一些封装处理,.Net把这种封装称之为委托器(Delegate)其代码如下:  
       
         
          
          //当btnSubmit按钮被点击以后要求交给btnSubmit_Click方法处理
    // EventHandler在中间启到委托器的作用,
    //它负责将事件分发到指定的方法中进行处理
    this.btnSubmit.Click += new EventHandler(this.btnSubmit_Click);
    //事件处理方法
    // object sender:事件源,这里指btnSubmit对象
    // EventArgs e:事件处理参数,它保存了需要提供给程序员的必要信息
    private void btnSubmit_Click(object sender, EventArgs e)
    {
       //打印This is a button语句
       System.Diagnostics.Debug.WriteLine("This is button");
    }
          
         
       

      作为对比,我们来看看Java Swing的事件处理和委托就要复杂一些:代码如下:
       
         
          
          //为btnSubmit增加侦听器SelectHandler,当btnSubmit被点击以后
    //有侦听器的actionPerformed负责处理该点击事件的业务
    //由于事件源btnSubmit和侦听器类SelectHandler处于两个不同的类中
    //为了让SelectHandler类取得页面的信息,我们需要将窗体对象(this)
    //传入到侦听器中
    btnSubmit.addActionListener(new SelectHandler(this));
    //侦听器SelectHandler,它必须实现动作事件ActionListener接口
    //以达到事件分发的作用
    class SelectHandler implements ActionListener {
       private CommonDialogDemo form = null;
       //将窗体对象CommonDialogDemo通过构造函数传入SelectHandler类中
       public SelectHandler(CommonDialogDemo form) {
         this.form = form;
       }
    //事件处理方法,当btnSubmit被点击,自动执行以下打印代码
       publicvoid actionPerformed(ActionEvent e) {
        System.out.println("This is button");
       }
    }
          
         
       
      
       
       
         
       

         
       
      
       根据以上代码,我们可以清晰的看到Java Swing要比.Net的麻烦一些,而且,一个页面如果有多个按钮的话,我们必须针对每个按钮编写多个事件侦听类,而且这些类一般都会被设为内部类。学过软件建模的读者可能知道,内部类在软件建模,在软件工程中是不推荐使用的,这样的代码编写明显会增加设计冗余度和复杂度,因此我们可以考虑自己编写一个类似于.Net中EventHandler一样的事件委托类来处理事件分发。

    这里借助于反射技术,利用一个事件委托类处理所有的点击事件,代码如下:



      
       
       package cn.softworks.teachersearchsystem.support;

    import java.awt.event.ActionEvent;
    import java.awt.event.ActionListener;
    import java.lang.reflect.Method;

    /**
    *该类是用来处理所有的Swing按钮点击事件,并根据将处理权

    *转交给使用者来处理
    *
    *@authorChen.yu
    *
    */
    publicclass EventHandlerimplements ActionListener {

    //组件所在的窗体对象
    private Object form = null;

    //受到委托的方法名
    private String methodName = null;

    /**
    *构造函数
    *
    *@paramform 组件所在的窗体对象
    *@parammethodName 受到委托的方法名
    */
    public EventHandler(Object form,String methodName) {
    this.form = form;
    this.methodName = methodName;
    }

    /**
    *事件处理委托方法
    */
    publicvoid actionPerformed(ActionEvent e) {

    //得到窗体对象的类型
    Class formType = this.form.getClass();

    try {
    //得到指定委托方法的类型
    Method method = formType.getMethod(this.methodName, new Class[] {e.getClass()});
    //调用指定的方法
    method.invoke(this.form, new Object[] {e});

    }catch(Exception ex) {
    return;
    }
    }
    }  
       
      

    现在我们来编写一个测试程序,代码如下:



      
       
       public class Myframe extends JFrame{
       JButton jb=new JButton("Click me");    public Myframe(String name){
         super(name);
         setLayout(new FlowLayout());
         add(jb);
         jb.addActionListener(new EventHandler(this,"btnSearch_Click"));

          setSize(300,200);
          setVisible(true);
       }

       public void btnSearch_Click(ActionEvent e) {
         System.out.println("This is btnSearch");
       }    public static void main(String[] args){
         new Myframe("EventHandler Test");

       }
    }
       
      

    从以上代码中我们可以清晰的看到,事件处理和事件委托处于同一窗体中了,.Net方便的Delegate处理被我们用反射实现了。

      
      
       
       

         
       

         
       
      
    复制代码

    源码下载:http://file.javaxxz.com/2014/10/30/235804968.zip
    回复

    使用道具 举报

    您需要登录后才可以回帖 登录 | 立即注册

    本版积分规则

    QQ|手机版|Java学习者论坛 ( 声明:本站资料整理自互联网,用于Java学习者交流学习使用,对资料版权不负任何法律责任,若有侵权请及时联系客服屏蔽删除 )

    GMT+8, 2024-5-5 19:44 , Processed in 0.382111 second(s), 46 queries .

    Powered by Discuz! X3.4

    © 2001-2017 Comsenz Inc.

    快速回复 返回顶部 返回列表