在上一篇文章Android 最火的快速开发框架XUtils中简单介绍了xUtils的基本使用方法,这篇文章说一下xUtils里面的注解原理。

先来看一下xUtils里面demo的代码:

@ViewInject(R.id.tabhost)    private FragmentTabHost mTabHost;@ViewInject(R.id.big_img)    private ImageView bigImage;

可能好多人一看就说这是个what,其实这是Java core里面的内容,做JavaEE的应该很熟悉,像著名的spring框架就用了大量的注解。那到底什么是注解呢?下面详细讲解一下Java注解:

注解(Annotation) 为我们在代码中添加信息提供了一种形式化的方法,是我们可以在稍后某个时刻方便地使用这些数据(通过 解析注解 来使用这些数据),常见的作用有以下几种:

  • 生成文档。这是最常见的,也是java 最早提供的注解。常用的有@see @param @return 等
  • 跟踪代码依赖性,实现替代配置文件功能。比较常见的是spring 2.5 开始的基于注解配置。作用就是减少配置。现在的框架基本都使用了这种配置来减少配置文件的数量。也是
  • 在编译时进行格式检查。如@override 放在方法前,如果你这个方法并不是覆盖了超类方法,则编译时就能检查出。

java.lang.annotation中包含所有定义自定义注解所需用到的原注解和接口。如接口java.lang.annotation.Annotation是所有注解继承的接口,并且是自动继承,不需要定义时指定,类似于所有类都自动继承Object。


Java注解是附加在代码中的一些元信息,用于一些工具在编译、运行时进行解析和使用,起到说明、配置的功能。注解不会也不能影响代码的实际逻辑,仅仅起到辅助性的作用。包含在 java.lang.annotation 包中。

Annotation类型里面的参数该怎么设定:
第一,只能用public或默认(default)这两个访问权修饰.例如,String value();这里把方法设为defaul默认类型.
第二,参数成员只能用基本类型byte,short,char,int,long,float,double,boolean八种基本数据类型和 String,Enum,Class,annotations等数据类型,以及这一些类型的数组.例如,String value();这里的参数成员就为String.
第三,如果只有一个参数成员,最好把参数名称设为"value",后加小括号.

1、元注解

元注解是指注解的注解。包括 @Retention @Target @Document @Inherited四种。

1.1、@Retention: 定义注解的保留策略

@Retention(RetentionPolicy.SOURCE)//注解仅存在于源码中,在class字节码文件中不包含 @Retention(RetentionPolicy.CLASS)// 默认的保留策略,注解会在class字节码文件中存在,但运行时无法得 @Retention(RetentionPolicy.RUNTIME)// 注解会在class字节码文件中存在,在运行时可以通过反射获取到
1.2、@Target:定义注解的作用目标
其定义的源码为: @Documented
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.ANNOTATION_TYPE)
public @interface Target {
ElementType[] value();
}

@Target(ElementType.TYPE)//接口、类、枚举、注解

@Target(ElementType.FIELD)//字段、枚举的常量 @Target(ElementType.METHOD)//方法 @Target(ElementType.PARAMETER)//方法参数 @Target(ElementType.CONSTRUCTOR)//构造函数 @Target(ElementType.LOCAL_VARIABLE)//局部变量 @Target(ElementType.ANNOTATION_TYPE)//注解 @Target(ElementType.PACKAGE)///包 其中的@interface是一个关键字,在设计annotations的时候必须把一个类型定义为@interface,而不能用class或interface关键字, 由以上的源码可以知道,他的elementType可以有多个,一个注解可以为类的,方法的,字段的等等。
1.3、@Document:说明该注解将被包含在javadoc中 1.4、@Inherited:说明子类可以继承父类中的该注解
2、java 注解的自定义
下面是自定义注解的一个例子

@Retention(RetentionPolicy.RUNTIME)定义的这个注解是注解会在class字节码文件中存在,在运行时可以通过反射获取到。

@Target({ElementType.TYPE,ElementType.METHOD})因此这个注解可以是类注解,也可以是方法的注解

这样一个注解就自定义好了,当然注解里面的成员可以为基本的数据类型,也可以为数据,Object等等

大概了解了一下Java注解机制,下面就说一说xUtils里面用到的注解,以及思维流程:

package com.lidroid.xutils.view.annotation;import java.lang.annotation.ElementType;import java.lang.annotation.Retention;import java.lang.annotation.RetentionPolicy;import java.lang.annotation.Target;@Target(ElementType.TYPE)@Retention(RetentionPolicy.RUNTIME)public @interface ContentView {    int value();}
以上是ContentView的注解,一些声明、参数。

 private static void injectObject(Object handler, ViewFinder finder) {        Class<?> handlerType = handler.getClass();        // inject ContentView        ContentView contentView = handlerType.getAnnotation(ContentView.class);        if (contentView != null) {            try {                Method setContentViewMethod = handlerType.getMethod("setContentView", int.class);                setContentViewMethod.invoke(handler, contentView.value());            } catch (Throwable e) {                LogUtils.e(e.getMessage(), e);            }        }}

以上是ViewUtils里面的一个静态注解对象函数,里面用到了上面声明的ContentView注解,getAnnotation是得到注解对象,handler是我们的activity传进来的指针,通过指针得到Class类型(这个是类的类)的handlerType,handlerType通过getMethod动态加载setContentView,setContentView大家都很熟悉就是Android里面的加载布局的函数,然后得到一个Method进行反射机制,实现函数加载。

setContentViewMethod.invoke(handler, contentView.value());这句话也可以这么理解,那就是handler有setContentViewMethod这个方法,setContentViewMethod这个方法的参数是contentView.value()。

这样就明白了为什么这样

@ContentView(R.layout.main)
public class MyActivity extends FragmentActivity 就可以实现加载布局的操作了,其他的xUtils的注解操作也是类似的。

下面是一个简单流程图:


如有问题请留言,转载注明出处。http://blog.csdn.net/rain_butterfly/article/details/37931031


更多相关文章

  1. 如何导入android中的sample例子
  2. Android(安卓)异步消息处理机制 让你深入理解 Looper、Handler、
  3. Android(安卓)获取IP地址的实现方法
  4. android 4.0 内核(3.0)编译方法
  5. Android的事件转递机制
  6. 关于android中的各种路径对应的方法
  7. Android(安卓)Logcat 直接输出JSON格式的数据
  8. 浅谈Java中Collections.sort对List排序的两种方法
  9. Python list sort方法的具体使用

随机推荐

  1. Android视频播放项目总结之 使用Android
  2. android editview与popwindow焦点冲突
  3. android Bitmap getByteCount和getRowByt
  4. android 比较精简的list对话框代码
  5. 关于用eclipse开发android经常出现R异常
  6. android signed apk
  7. Android 获取JSP或ASP的sessionId(Cookie)
  8. android assets 的说明与应用
  9. Binder系列7—framework层分析
  10. Android Retrofit 笔记之一使用拦截器设