一、 承接上一篇,第二个例子,利用注解来配置,为控件配置监听器实现类
首先定义注解
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可以在编译时生成一些文件来简化开发