少年恃险若平地,独倚长剑凌清秋。这篇文章主要讲述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.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进行反射机制,实现函数载入。
【Android 最火框架XUtils之注解机制具体解释】
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
推荐阅读
- 华硕k455L笔记本win10系统改装win8.1系统无法U盘打开
- android 7.0 (nougat)的编译优化-ninja
- 三. 200多万元得到的创业教训--创业并不须要app
- android POI搜索,附近搜索,周边搜索定位介绍
- Android 状态栏那些小坑()
- AppletScriptlet与Servlet
- HDU 5303 Delicious Apples (贪心 枚举 好题)
- Ubuntu使用adb连接android手机失败unknown的解决的方法
- Delphi 10.1.2 berlin开发跨平台APP的几点经验