在上一篇文章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是一个keyword。在设计annotations的时候必须把一个类型定义为@interface,而不能用class或interfacekeyword,由以上的源代码能够知道,他的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

Android 最火框架XUtils之注解机制具体解释的更多相关文章

  1. 【转】Android 最火框架XUtils之注解机制详解

    原文:http://blog.csdn.net/rain_butterfly/article/details/37931031 在上一篇文章Android 最火的快速开发框架XUtils中简单介绍了x ...

  2. Android 最火框架XUtils之注解机制详解

    http://blog.csdn.net/rain_butterfly/article/details/37931031

  3. Android 最火的高速开发框架AndroidAnnotations使用具体解释

    Android 最火的高速开发框架androidannotations配置具体解释文章中有eclipse配置步骤.Android 最火高速开发框架AndroidAnnotations简介文章中的简介. ...

  4. Android 最火开发框架 xUtils

    xUtils简介 xUtils3 api变化较多, 已转至 https://github.com/wyouflf/xUtils3 xUtils 2.x对Android 6.0兼容不是很好, 请尽快升级 ...

  5. Android 最热的高速发展框架XUtils

    近期搜了一些框架供刚開始学习的人学习,比較了一下XUtils是眼下git上比較活跃 功能比較完好的一个框架,是基于afinal开发的,比afinal稳定性提高了不少.以下是介绍: 鉴于大家的热情,我又 ...

  6. 【转】Android 最火的快速开发框架XUtils

    原文:http://blog.csdn.net/rain_butterfly/article/details/37812371 最近搜了一些框架供初学者学习,比较了一下XUtils是目前git上比较活 ...

  7. Android 最火高速开发框架AndroidAnnotations简单介绍

    在上一篇Android 最火的高速开发框架androidannotations配置具体解释中介绍了在eclipse中配置androidannotation的步骤,如需配置请參考. 1.目标 andro ...

  8. Android 最火高速开发框架AndroidAnnotations使用具体解释

    Android 最火的高速开发框架androidannotations配置具体解释文章中有eclipse配置步骤,Android 最火高速开发框架AndroidAnnotations简介文章中的简介, ...

  9. 【Android框架进阶〖0〗】ThinkAndroid注解机制

    由于项目需要,开始研究ThinkAndroid. 个人认为该框架的注解机制十分新颖,所以先研究这个,顺便学习下 Java 的annotation. 粗略的看了看,该机制在BaseActivity中初始 ...

随机推荐

  1. JavaSE-12 面向对象程序设计的几条基础原则

    摘取代码中变化的行为,形成接口 在设计基类的时候,如果该类某个成员方法在子类中的实现变化差别比较大(一部分子类实现该方法是相同的),作为基类有两个问题:一是该方法不再通用:二是子类如果重写该方法,存在 ...

  2. 下载kaggle数据集,验证手机号

    https://blog.csdn.net/Tomxiaodai/article/details/80167765 kaggle上下载一下数据集必须手机验证,结果验证时一直提示错误输入的格式错误,试了 ...

  3. go的指针学习

    1)指针是什么? 一个指针变量可以指向任何一个值的内存地址它指向那个值的内存地址 说白了就是可以先存储内存的地址,在用内存地址找到对应值 2)go中的使用 Go 语言的取地址符是 &,放到一个 ...

  4. Delphi新注释

    标准请看帮助文件里的:XML Documentation Comments 个人常用 <summary></summary>:摘要 /// <summary> // ...

  5. 基于js插件的文件上传

    <?php /** * Created by PhpStorm. * User: GyCCo. * Date: 05/02/2018 * Time: 4:46 PM */ session_sta ...

  6. action类中属性驱动和模型驱动的区别

    1.Struts2的属性驱动 在Action类中,属性××通过get××()和set××()方法,把参数在整个生命周期内进行传递,这就是属性驱动 代码如下: package org.abu.csdn. ...

  7. MySQL和Oracle的比较

    可以从以下几个方面来进行比较: (1) 对事务的提交    MySQL默认是自动提交,而Oracle默认不自动提交,需要用户手动提交,需要在写commit;指令或者点击commit按钮(2) 分页查询 ...

  8. Yii 2.0 query模式语法

    项目使用Yii 2.0版本开发,个人一直喜好使用(new \yii\db\Query())模式操作数据,把增.删.查.改这4种情况的写法整理出来,方便查阅和记忆. 增加 - insert use Yi ...

  9. HashMap、ConcurrentHashMap以及HashTable(面试向)

    ---->HashMap 在java1.7中,hashmap的数据结构是基于数组+链表的结构,即我们比较熟悉的Entry数组,其包含的(key-value)键值对的形式.在多线程环境下,Hash ...

  10. mysql事物隔离

    1.读未提交(行锁) 会发生脏读,事物未提交被其他事物看到,未提交的数据为脏数据. 2.读已提交(行锁) 会发生不可重复读,事物开始时,只能看到已经提交了的事物修改. 3.重复读(行锁) 该级别保证了 ...