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

原文地址:https://www.cnblogs.com/Theshy/p/7508807.html