zoukankan      html  css  js  c++  java
  • xUtils如何通过注解对FindViewById进行封装

      之前讲到了介绍了一下xUtils的基本使用方法,今天我们就来详细介绍一下关于xUtils中的ViewUtils模块。

      在ViewUtils模块中我们首先看到的是它采用了一种注解的方式进行声明,那么我们首先来了解一下什么是注解。

      注解(Annotation)很重要,未来的开发模式都是基于注解的,JPA是基于注解的,Spring2.5以上都是基于注解的,Hibernate3.x以后也是基于注解的,现在的Struts2有一部分也是基于注解的了,注解是一种趋势,现在已经有不少的人开始用注解了,注解是JDK1.5之后才有的新特性。

      JDK1.5之后内部提供的三个注解

           @Deprecated 意思是“废弃的,过时的”

           @Override 意思是“重写、覆盖”

           @SuppressWarnings 意思是“压缩警告”

      我们首先来了解一下JDK内部提供的注解中比较难懂的一个SuppressWarnings,这是从jdk1.5的文档中找到的SuppressWarnings的值

    all  - suppress all warnings from this code  

    deprecation  - suppress warnings from using deprecated code  

    unchecked - suppress warnings from an unchecked call or an unchecked cast  

    fallthrough - suppress warnings if a switch falls through without finding a valid case (and no default)  

    serial - suppress warnings if a Serializable class does not define a serialVersionUID  

    finally - suppress warnings from return within a finally (which will ignore return with the try) 

      示例:

    ·   @SuppressWarnings("unchecked")

    告诉编译器忽略 unchecked 警告信息,如使用List,ArrayList等未进行参数化产生的警告信息。

    ·   @SuppressWarnings("serial")

    如果编译器出现这样的警告信息:The serializable class WmailCalendar does not declare a static final serialVersionUID field of type long
           使用这个注释将警告信息去掉。

    ·   @SuppressWarnings("deprecation")

    如果使用了使用@Deprecated注释的方法,编译器将出现警告信息。
           使用这个注释将警告信息去掉。

    ·   @SuppressWarnings("unchecked", "deprecation")

    告诉编译器同时忽略unchecked和deprecation的警告信息。

    ·   @SuppressWarnings("unused")

    告诉编译器同时忽略没有用过的变量

      举个例子

      定义一个变量的时候会出现警告 The local variable jerehedu is never read。 警告我们的变量没有被用过,当我们加上注解@SuppressWarnings("unused")

      警告就没有了。这个就是注解的作用。

         了解了注解的作用,我们再准备自己写一个注解,我们首先来看一下在ViewUtils模块中它的注解是怎么写的,以@ViewInject为例。

      这个是viewinject的源码,在我们的ViewUtils中我们可以看到

    // inject view
            Field[] fields = handlerType.getDeclaredFields();
            if (fields != null && fields.length > 0) {
                for (Field field : fields) {
                    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);
                            }
                        } catch (Throwable e) {
                            LogUtils.e(e.getMessage(), e);
                        }
                    } else {
                        ResInject resInject = field.getAnnotation(ResInject.class);
                        if (resInject != null) {
                            try {
                                Object res = ResLoader.loadRes(
                                        resInject.type(), finder.getContext(), resInject.id());
                                if (res != null) {
                                    field.setAccessible(true);
                                    field.set(handler, res);
                                }
                            } catch (Throwable e) {
                                LogUtils.e(e.getMessage(), e);
                            }
                        } else {
                            PreferenceInject preferenceInject = field.getAnnotation(PreferenceInject.class);
                            if (preferenceInject != null) {
                                try {
                                    Preference preference = finder.findPreference(preferenceInject.value());
                                    if (preference != null) {
                                        field.setAccessible(true);
                                        field.set(handler, preference);
                                    }
                                } catch (Throwable e) {
                                    LogUtils.e(e.getMessage(), e);
                                }
                            }
                        }
                    }
                }
            }

      首先获得文件的注解为ViewInject

      ViewInject viewInject = field.getAnnotation(ViewInject.class);

      将我们通常所写的findViewById封装在这里

      findviewbyidView view = finder.findViewById(viewInject.value(), viewInject.parentId());

      至于如何封装在我们的ViewFinder中可以找到

      这就是我们的xUtils如何通过注解的方式来完成对findViewById这个方法的二次封装

      疑问咨询或技术交流,请加入官方QQ群:JRedu技术交流 (452379712)

    作者:杰瑞教育
    出处:http://www.cnblogs.com/jerehedu/ 
    本文版权归烟台杰瑞教育科技有限公司和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。
     
  • 相关阅读:
    演示一个简单的Redis队列
    Quartz.net 基于配置的调度程序实践
    阿里云OSS分片上传DEMO
    java基础 -- 关键字static的用法
    java基础 -- 关键字final的用法
    Linux中安装软件和各种常用命令
    python获取网页信息的三种方法
    jquery中获取ajax请求返回数据的方法
    Jquery为动态添加的元素添加事件
    js中时间戳转换成xxxx-xx-xx xx:xx:xx类型日期格式的做法
  • 原文地址:https://www.cnblogs.com/jerehedu/p/4549686.html
Copyright © 2011-2022 走看看