[非官方]苍穹平台@注解支持探究(三)自动注册和helper实现原创
金蝶云社区-shiro
shiro
3人赞赏了该文章 611次浏览 未经作者许可,禁止转载编辑于2022年09月08日 09:24:41

1.helper实现

上文我们讲解了方法是如何被过滤的,这次我们讲一下helper是怎么实现的。

在设计上,helper被设计为一个类中的私有变量,代理本类的所有方法。

map的key为标识,value为处理方法。

里边并不复杂,首先把外部类中过滤出来的函数分别封装为各个map,例如onClickMethods这个map里面封装的就是带有@Onclick注解的方法,也就是以前的click事件。

public static class AnnotationHelper {
        //click事件方法集合
        private final Map<String, Method> onClickMethods = new HashMap<>();
        //itemClick 控件名称
        private final Set<String> itemClickControlSet=new HashSet<>();
        //itemClick 方法集合
        private final Map<String, Method> onClickItemMethods = new HashMap<>();
        //被代理的 Form
        private final AbstractFormAnnotationPlugin owner;

        private AnnotationHelper(Map<String, Method> methods, AbstractFormAnnotationPlugin owner) {
            this.owner = owner;
            for (Map.Entry<String, Method> entry : methods.entrySet()) {
                Method value = entry.getValue();
                //封装click事件
                this.initOnClickMethods(value);
                //封装itemClick事件
                this.initOnItemClickMethods(value);
                // ...
            }
        }

        /**
         * 触发click事件
         *
         * @param e 事件对象
         */

        public void click(EventObject e) {
            Control source = (Control) e.getSource();
            String key = source.getKey();
            Method method = onClickMethods.get(key);
            invoke(method, e);
        }

这里主要通过click方法进行调用,具体非常简单,只要按照标识到map中取出然后调用即可。

private void invoke(Method method, EventObject event) {
            try {
                if (method == null) {
                    return;
                }
                if (method.getParameters().length == 0) {
                    method.invoke(owner);
                } else if (method.getParameters().length == 1) {
                    method.invoke(owner, event);
                }
            } catch (IllegalAccessException | InvocationTargetException e) {
                this.owner.getView().showErrMessage("方法不存在或绑定错误", Arrays.toString(e.getStackTrace()));
                e.printStackTrace();
            }
        }

由于我支持了空参特性,所以这里method判断了一下参数数量。

2.自动注册

由于click和itemclick方法本质上都是实现了ISuportClick 接口,所以只要从owner中取出标识注册即可

 private void ClickRegisterListener() {

            for (Map.Entry<String, Method> item : onClickMethods.entrySet()) {
                String key = item.getKey();
                ISuportClick iSuportClick = this.owner.getControl(key);
                iSuportClick.addClickListener(this.owner);
            }
            for (String controlSign : itemClickControlSet) {
                ISuportClick iSuportClick = this.owner.getControl(controlSign);
                iSuportClick.addItemClickListener(this.owner);
            }

        }


赞 3