zoukankan      html  css  js  c++  java
  • java核心学习(十) 注解Annotation----下

    一、  承接上一篇,第二个例子,利用注解来配置,为控件配置监听器实现类

      首先定义注解

    package AnnotationTest;
    
    import java.awt.event.ActionListener;
    import java.lang.annotation.ElementType;
    import java.lang.annotation.Retention;
    import java.lang.annotation.RetentionPolicy;
    import java.lang.annotation.Target;
    
    @Target(ElementType.FIELD)
    @Retention(RetentionPolicy.RUNTIME)
    public @interface ActionListenerFor {
        //用于保存监听器的实现类,该类继承自事件监听接口,使用通配符来标识对所有继承或实现了Action
        Class<? extends ActionListener> listener();
    }

      然后使用该注解

    package AnnotationTest;
    
    import javax.swing.*;
    import java.awt.event.ActionEvent;
    import java.awt.event.ActionListener;
    
    public class AnnotationTest {
        private JFrame mainWin = new JFrame("使用注解绑定事件监听器");
        @ActionListenerFor(listener = OkListener.class)
        private JButton ok = new JButton("确定");
        @ActionListenerFor(listener = CancelListener.class)
        private JButton cancel = new JButton("取消");
        public void init(){
            JPanel jPanel = new JPanel();
            jPanel.add(ok);
            jPanel.add(cancel);
            mainWin.add(jPanel);
          ActionListenerInstaller.processAnnotation(this);
            mainWin.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
            mainWin.pack();
            mainWin.setVisible(true);
        }
        public static void main(String args[])
        {
            new AnnotationTest().init();
        }
    }
    //ok按钮的事件监听类
    class OkListener implements ActionListener
    {
        public void actionPerformed(ActionEvent evt)
        {
            JOptionPane.showMessageDialog(null,"单机了确定按钮");
        }
    }
    //Cancel按钮的事件监听类
    class CancelListener implements ActionListener
    {
        public void actionPerformed(ActionEvent evt){
            JOptionPane.showMessageDialog(null,"单击了取消按钮");
        }
    }

      最后编写注解的反射处理工具

    package AnnotationTest;
    
    import javax.swing.*;
    import java.awt.event.ActionListener;
    import java.lang.reflect.Field;
    
    public class ActionListenerInstaller {
        //将主类传给该解释系
        public static void processAnnootations(Object object)
        {
            try
            {
                Class cl = object.getClass();//获得主类的Class对象
                for (Field f:cl.getDeclaredFields()  //取得所有成员变量(包括私有)
                     ) {
                    //将该成员变量设置为可自由访问
                    f.setAccessible(true);
                    //取得成员变量的ActionListenerFor注解
                    ActionListenerFor a = f.getAnnotation(ActionListenerFor.class);
                    //取得object对象的f成员的值
                    Object fObj = f.get(object);
                    if(a != null && fObj != null && fObj instanceof AbstractButton){
                        //注解a里面的listener元数据是一个监听器类Class对象,创建它的新实例
                        ActionListener a1 = a.listener().newInstance();
                        AbstractButton ab = (AbstractButton)fObj;
                        ab.addActionListener(a1);
                    }
    
                }
            }catch (IllegalAccessException e){
                e.printStackTrace();
            }catch (InstantiationException e){
                e.printStackTrace();
            }
        }
    }

    二、编译时处理Annotation

      APT ,Annotation Processing Tool,编译时注解处理工具,对源代码进行检测找出源文件包含的Annotation信息,然后对Annotation信息进行额外的处理。在编译的时候使用javac.exe的-processor选项来制定Annotation处理器

      编译时处理的注解定义时Retention的value为RetentionPolicy.SOURCE

      这种编译时处理的Annotation可以在编译时生成一些文件来简化开发

  • 相关阅读:
    【Android】12.0 UI开发(三)——列表控件ListView的简单实现2
    【Android】11.0 UI开发(二)——列表控件ListView的简单实现1
    【Android】10.0 UI开发——如何编写程序界面、常见控件的使用
    【转载】从创业者角度看《印度合伙人 Padman》后的一点感受
    【代码笔记】Java常识性基础补充(二)——数组、ArrayList集合、ASCII编码、 eclipse基础操作、eclipse调试、eclipse项目导入、eclipse快捷键
    Android 实现高斯模糊效果和圆角图片
    Android 获取当前系统时间
    Android RecycleView悬浮按钮点击返回顶部
    eclipse连接mysql
    mysql的增删改查语句
  • 原文地址:https://www.cnblogs.com/Theshy/p/7508807.html
Copyright © 2011-2022 走看看