Android 最火框架XUtils之注解机制具体解释
在上一篇文章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.RUNTIME)
@Target(ElementType.ANNOTATION_TYPE)
public @interface Target {
ElementType[] value();
}
@Target(ElementType.TYPE) //接口、类、枚举、注解
@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之注解机制具体解释的更多相关文章
- 【转】Android 最火框架XUtils之注解机制详解
原文:http://blog.csdn.net/rain_butterfly/article/details/37931031 在上一篇文章Android 最火的快速开发框架XUtils中简单介绍了x ...
- Android 最火框架XUtils之注解机制详解
http://blog.csdn.net/rain_butterfly/article/details/37931031
- Android 最火的高速开发框架AndroidAnnotations使用具体解释
Android 最火的高速开发框架androidannotations配置具体解释文章中有eclipse配置步骤.Android 最火高速开发框架AndroidAnnotations简介文章中的简介. ...
- Android 最火开发框架 xUtils
xUtils简介 xUtils3 api变化较多, 已转至 https://github.com/wyouflf/xUtils3 xUtils 2.x对Android 6.0兼容不是很好, 请尽快升级 ...
- Android 最热的高速发展框架XUtils
近期搜了一些框架供刚開始学习的人学习,比較了一下XUtils是眼下git上比較活跃 功能比較完好的一个框架,是基于afinal开发的,比afinal稳定性提高了不少.以下是介绍: 鉴于大家的热情,我又 ...
- 【转】Android 最火的快速开发框架XUtils
原文:http://blog.csdn.net/rain_butterfly/article/details/37812371 最近搜了一些框架供初学者学习,比较了一下XUtils是目前git上比较活 ...
- Android 最火高速开发框架AndroidAnnotations简单介绍
在上一篇Android 最火的高速开发框架androidannotations配置具体解释中介绍了在eclipse中配置androidannotation的步骤,如需配置请參考. 1.目标 andro ...
- Android 最火高速开发框架AndroidAnnotations使用具体解释
Android 最火的高速开发框架androidannotations配置具体解释文章中有eclipse配置步骤,Android 最火高速开发框架AndroidAnnotations简介文章中的简介, ...
- 【Android框架进阶〖0〗】ThinkAndroid注解机制
由于项目需要,开始研究ThinkAndroid. 个人认为该框架的注解机制十分新颖,所以先研究这个,顺便学习下 Java 的annotation. 粗略的看了看,该机制在BaseActivity中初始 ...
随机推荐
- thinkphp5生成二维码
1.运用composer下载拓展到vendor下 composer require aferrandini/phpqrcode 2.common.php 里面写生成二维码函数 <?php // ...
- torch.nn.Embedding理解
Pytorch官网的解释是:一个保存了固定字典和大小的简单查找表.这个模块常用来保存词嵌入和用下标检索它们.模块的输入是一个下标的列表,输出是对应的词嵌入. torch.nn.Embedding(nu ...
- jquery toggle()设置
很多朋友对jquery toggle()比较熟练,甚至经常用到,而且对toggle的三个参数也比较了解$(selector).toggle(speed,callback,switch).但是当你设置$ ...
- 用1天快速上手org-mode(windows系统)
Table of Contents 1. 选择Emacs的理由--Org-mode 1.1. 现状(基于本人现有软件的使用) 1.2. 理念(够用才好) 1.3. 学习过程(少走弯路) 2. 快速安装 ...
- [模板] Splay
欠了好久的Splay,以后就它了. 默写真不容易,过几天估计就忘了.. 整个Splay真的精妙,不拖泥带水那种.. 前驱后继之所以不能用rk转到根,是因为这个数不一定存在.. kth中<=老忘记 ...
- pycharm中提交Git 忽略部分代码
痛点: 项目中,有些配置项,或者比较隐私的东东,不想上传 解决:在项目根路径下,创建.gitignore 文件 文件中可以写文件名.文件路径等 结果: 提交到git,发现果真没有dbconne ...
- STM32F407 跑马灯 库函数版 个人笔记
原理图: MCU在开发板原理图的第二页,LED在开发板原理图的第三页 由图可知,PF9 ,PF10 若输出低电平则灯亮,高电平则灯灭 选推挽输出 代码步骤 使能IO口时钟. 调用函数RCC_AHB1P ...
- 6.0以上,SYSTEM_ALERT_WINDOW 权限的问题
6.0以上会因为SYSTEM_ALERT_WINDOW权限的问题,无法在最上层显示. 用户打开软件设置页手动打开,才能授权.路径是:Settings->Apps->App Setting- ...
- fmt:formatDate的输出格式详解
<fmt:formatDate value="${isoDate}" type="both"/> 2004-5-31 23:59:59 <fm ...
- POJ-2239 Selecting Courses,三维邻接矩阵实现,钻数据空子。
Selecting Courses Time Limit: 1000MS Memory Limit: 65536K Description It is well known that ...