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

点击阅读原文

------------------------------------------------------

这篇文章说一下xUtils里面的注解原理。

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

[java] view plaincopy print?
  1. @ViewInject(R.id.tabhost)
  2. private FragmentTabHost mTabHost;
  3. @ViewInject(R.id.big_img)
  4. 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里面用到的注解,以及思维流程:

[java] view plaincopy print?
  1. package com.lidroid.xutils.view.annotation;
  2. import java.lang.annotation.ElementType;
  3. import java.lang.annotation.Retention;
  4. import java.lang.annotation.RetentionPolicy;
  5. import java.lang.annotation.Target;
  6. @Target(ElementType.TYPE)
  7. @Retention(RetentionPolicy.RUNTIME)
  8. public @interface ContentView {
  9. int value();
  10. }

以上是ContentView的注解,一些声明、参数。

[java] view plaincopy print?
  1. private static void injectObject(Object handler, ViewFinder finder) {
  2. Class<?> handlerType = handler.getClass();
  3. // inject ContentView
  4. ContentView contentView = handlerType.getAnnotation(ContentView.class);
  5. if (contentView != null) {
  6. try {
  7. Method setContentViewMethod = handlerType.getMethod("setContentView", int.class);
  8. setContentViewMethod.invoke(handler, contentView.value());
  9. } catch (Throwable e) {
  10. LogUtils.e(e.getMessage(), e);
  11. }
  12. }}

以上是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的注解操作也是类似的。

下面是一个简单流程图:

-------------

更多的Java,Angular,Android,大数据,J2EE,Python,数据库,Linux,Java架构师,:

http://www.cnblogs.com/zengmiaogen/p/7083694.html

XUtils之注解机制详解相关推荐

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

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

  2. Java基础-注解机制详解

    文章目录 1. 注解基础 1.1 Java内置注解 1.1.1 内置注解 - @Override 1.1.2 内置注解 - @Deprecated 1.1.3 内置注解 - @SuppressWarn ...

  3. Spring 3.0 注解注入详解

    Spring 3.0 注解注入详解 2011-04-15 09:44 17ZOUGUO ITEYE博客 我要评论(1) 字号:T | T AD: 一.各种注解方式 1.@Autowired注解(不推荐 ...

  4. PHP autoload机制详解

    PHP autoload机制详解 转载自 jeakccc PHP autoload机制详解 (1) autoload机制概述 在使用PHP的OO模式开发系统时,通常大家习惯上将每个类的实现都存放在一个 ...

  5. 模糊匹配 读音_onenote搜索机制详解②:两种搜索模式,模糊与精确匹配

    先从纯文本搜索讲起,这是最基本也是最重要的. 从这篇开始,以及接下来连续几篇文章,都会介绍搜索的基础功能.注意,这几篇文章中谈论的都是基本的.正常的搜索功能,暂时不考虑Bug等因素. 在很多软件(例如 ...

  6. Java类加载机制详解【java面试题】

    Java类加载机制详解[java面试题] (1)问题分析: Class文件由类装载器装载后,在JVM中将形成一份描述Class结构的元信息对象,通过该元信息对象可以获知Class的结构信息:如构造函数 ...

  7. Numpy的广播机制详解(broadcasting)

    Numpy的广播机制详解(broadcasting) 广播(Broadcast)是 numpy 对不同形状(shape)的数组进行数值计算的方式, 对数组的算术运算通常在相应的元素上进行. 如果两个数 ...

  8. spring之旅第四篇-注解配置详解

    spring之旅第四篇-注解配置详解 一.引言 最近因为找工作,导致很长时间没有更新,找工作的时候你会明白浪费的时间后面都是要还的,现在的每一点努力,将来也会给你回报的,但行好事,莫问前程!努力总不会 ...

  9. Session机制详解及分布式中Session共享解决方案

    Session机制详解及分布式中Session共享解决方案 参考文章: (1)Session机制详解及分布式中Session共享解决方案 (2)https://www.cnblogs.com/jing ...

最新文章

  1. oracle显性游标,Oracle高级显式游标的使用
  2. NYOJ 16 矩形嵌套
  3. 数据中台 画像标签_数据中台实战:如何通过标签平台圈出产品高价值用户?...
  4. jQuery jsonp跨域请求
  5. 软件究竟是如何传播的?
  6. 浪潮工程师窃取公司CPU、硬盘在咸鱼挂卖被阿里发现,判处有期徒刑3年3个月...
  7. css3技巧——产品列表之鼠标滑过效果(一)
  8. CCIE学习笔记 2---BGP选路(属性值)
  9. SQL 常用语句INSERT INTO,UPDATE,DELETE
  10. 网格计算和云计算之间的比较
  11. 互联网金融监管意见将出台
  12. 使用BottomSheetDialogFragment实现购买出商品,底部弹出商品属性的效果
  13. Javamail发信和收信机制(smtp、pop3、imap)
  14. 使用cmake搭建一个跨平台游戏服务器
  15. Arduino灰度传感器PID巡线
  16. 线上java程序CPU占用过高问题排查
  17. HGU3336 Count the string (KMP Next数组的应用)
  18. webug 4.0 第二十二关 越权修改密码
  19. 如何跟进团队的沟通、协作和执行?这款团队协作软件你得试试
  20. mtk android vibration小结

热门文章

  1. Oracle自定义类型
  2. java newfile() bug_java初学者小白?遇到BUG就慌了?有关java异常的十大问题详解!...
  3. android target unknown and state offline解决办法
  4. java dao 泛型的好处_java中泛型有什么作用
  5. micopython 18b20_MicroPython控制8*8LED点阵显示温度
  6. java mongodb 插入数据_mongoDB 插入数据 用java实现
  7. 模型稳定后放在服务器上,把工程放在服务器上
  8. android html转pdf工具,android – 使用iText库将html转换为pdf时未应用hr的内联CSS
  9. 4n35光耦引脚图_光耦继电器的主要特点以及输入特性!先进光半导体
  10. GooglePerformanceTools--tcmalloc