• 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可以在编译时生成一些文件来简化开发

  • 相关阅读:
    如何卸载服务(转)
    The Frightening Science of Prediction: How Target & 10 Others Make Money Predicting Your Next Life Event(转摘)
    如果你迷恋厚实的屋顶,就会失去浩瀚的繁星
    李开复:移动互联网创业不要总是“入口思维”(转)
    [微言]增长与幸福 zz
    缔元信
    Tabledriven Approach
    北京医院排名 很有用,留下了
    青春期企业如何突围(转)
    意大利罗马&佛罗伦萨 攻略
  • 原文地址:https://www.cnblogs.com/Theshy/p/7508807.html
Copyright © 2020-2023  润新知