通过注解来为按钮设置监听,类似于黄油匕首(butterknife)。

步骤:

通过Annotation为按钮设置监听(ButterKnife的原理) - 图1

  1. @Retention(RetentionPolicy.RUNTIME)
  2. @Target(ElementType.FIELD)
  3. //注意这里两个元注解,RUNTIME保证运行时,保证可以被反射,FIELD表示目标是成员变量
  4. public @interface ListenerFor {
  5. Class<?extends ActionListener> listener();
  6. }

  1. public class ActionListenerInstaller {
  2. public static void proccessAnnotations(Object object){
  3. try {
  4. Class cl=object.getClass();
  5. for (Field f:cl.getDeclaredFields()){
  6. f.setAccessible(true);
  7. ListenerFor listenerFor=f.getAnnotation(ListenerFor.class);
  8. //获取成员变量f的值
  9. Object fieldObject=f.get(object);
  10. if (listenerFor!=null&&fieldObject!=null&&
  11. fieldObject instanceof AbstractButton){
  12. //获取listenerFor里的元数据(是Class<?extends ActionListener>)
  13. Class<?extends ActionListener> listenerClass=listenerFor.listener();
  14. ActionListener actionListener=listenerClass.newInstance();
  15. AbstractButton button= (AbstractButton) fieldObject;
  16. button.addActionListener(actionListener);
  17. }
  18. }
  19. }catch (Exception e){
  20. e.printStackTrace();
  21. }
  22. }
  23. }

  1. class OKListener implements ActionListener{
  2. @Override
  3. public void actionPerformed(ActionEvent e) {
  4. JOptionPane.showMessageDialog(null,"点击了确认按钮");
  5. }
  6. }
  7. class CancelListener implements ActionListener{
  8. @Override
  9. public void actionPerformed(ActionEvent e) {
  10. JOptionPane.showMessageDialog(null,"点击了取消按钮");
  11. }
  12. }
  13. public class MainTest {
  14. private JFrame mainWin=new JFrame("使用注解绑定事件监听器");
  15. //使用Annotation为按钮绑定事件监听器:
  16. @ListenerFor(listener =OKListener.class )
  17. private JButton okBtn=new JButton("确定");
  18. @ListenerFor(listener = CancelListener.class)
  19. private JButton cBtn=new JButton("取消");
  20. public void init(){
  21. JPanel jp=new JPanel();
  22. jp.add(okBtn);
  23. jp.add(cBtn);
  24. mainWin.add(jp);
  25. ActionListenerInstaller.proccessAnnotations(this);
  26. mainWin.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
  27. mainWin.pack();
  28. mainWin.setVisible(true);
  29. }
  30. public static void main(String args[]) throws Exception {
  31. new MainTest().init();
  32. }
  33. }

运行:
通过Annotation为按钮设置监听(ButterKnife的原理) - 图2

通过Annotation为按钮设置监听(ButterKnife的原理) - 图3
通过Annotation为按钮设置监听(ButterKnife的原理) - 图4

参考:《疯狂java讲义》