美文网首页
XUtil注释方式解析流程

XUtil注释方式解析流程

作者: 小慕汐 | 来源:发表于2016-08-12 19:29 被阅读78次
    Paste_Image.png

    BaseActivity进行初始化

    Paste_Image.png

    继承的Activity绑定ContentView

    Paste_Image.png

    内部执行过程

    Paste_Image.png

    递归查找是否注解了ContentView

    Paste_Image.png

    查找是否注解了field和method排除一些类型

    private static void injectObject(Object handler, Class<?> handlerType, ViewFinder finder) {
    
        if (handlerType == null || IGNORED.contains(handlerType)) {
            return;
        }
    
        // 从父类到子类递归
        injectObject(handler, handlerType.getSuperclass(), finder);
    
        // inject view
        Field[] fields = handlerType.getDeclaredFields();
        if (fields != null && fields.length > 0) {
            for (Field field : fields) {
    
                Class<?> fieldType = field.getType();
                if (
                /* 不注入静态字段 */     Modifier.isStatic(field.getModifiers()) ||
                /* 不注入final字段 */    Modifier.isFinal(field.getModifiers()) ||
                /* 不注入基本类型字段 */  fieldType.isPrimitive() ||
                /* 不注入数组类型字段 */  fieldType.isArray()) {
                    continue;
                }
    
                ViewInject viewInject = field.getAnnotation(ViewInject.class);
                if (viewInject != null) {
                    try {
                        View view = finder.findViewById(viewInject.value(), viewInject.parentId());
                        if (view != null) {
                            field.setAccessible(true);
                            field.set(handler, view);
                        } else {
                            throw new RuntimeException("Invalid @ViewInject for " + handlerType.getSimpleName() + "." + field.getName());
                        }
                    } catch (Throwable ex) {
                        LogUtil.e(ex.getMessage(), ex);
                    }
                }
            }
        } // end inject view
    
        // inject event
        Method[] methods = handlerType.getDeclaredMethods();
        if (methods != null && methods.length > 0) {
            for (Method method : methods) {
    
                if (Modifier.isStatic(method.getModifiers()) || !Modifier.isPrivate(method.getModifiers())) {
                    continue;
                }
    
                //检查当前方法是否是event注解的方法
                Event event = method.getAnnotation(Event.class);
                if (event != null) {
                    try {
                        // id参数
                        int[] values       = event.value();
                        int[] parentIds    = event.parentId();
                        int   parentIdsLen = parentIds == null ? 0 : parentIds.length;
                        //循环所有id,生成ViewInfo并添加代理反射
                        for (int i = 0; i < values.length; i++) {
                            int value = values[i];
                            if (value > 0) {
                                ViewInfo info = new ViewInfo();
                                info.value = value;
                                info.parentId = parentIdsLen > i ? parentIds[i] : 0;
                                method.setAccessible(true);
                                EventListenerManager.addEventMethod(finder, info, event, handler, method);
                            }
                        }
                    } catch (Throwable ex) {
                        LogUtil.e(ex.getMessage(), ex);
                    }
                }
            }
        } // end inject event
    
    }
    

    不过效率上用反射的方式可能有问题

    相关文章

      网友评论

          本文标题:XUtil注释方式解析流程

          本文链接:https://www.haomeiwen.com/subject/czdesttx.html