[非官方]苍穹平台@注解支持探究(三)自动注册和helper实现原创
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); } }
推荐阅读