Android 最火框架XUtils之注解机制具体解释

摘要:
在上一篇文章Android最火的高速开发框架XUtils中简介了xUtils的基本用法,这篇文章说一下xUtils里面的注解原理。像著名的spring框架就用了大量的注解。包java.lang.annotation中包括全部定义自己定义注解所需用到的原注解和接口。也能够为数据,Object等等大概了解了一下Java注解机制,以下就说一说xUtils里面用到的注解,以及思维流程:packagecom.lidroid.xutils.view.annotation;importjava.lang.annotation.ElementType;importjava.lang.annotation.Retention;importjava.lang.annotation.RetentionPolicy;importjava.lang.annotation.Target;@Target@Retentionpublic@interfaceContentView{intvalue();}以上是ContentView的注解,一些声明、參数。

在上一篇文章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的注解操作也是类似的。

以下是一个简单流程图:

Android 最火框架XUtils之注解机制具体解释第1张
如有问题请留言。转载注明出处。http://blog.csdn.net/rain_butterfly/article/details/37931031


免责声明:文章转载自《Android 最火框架XUtils之注解机制具体解释》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇Netty简介记录一个Windows explorer进程卡死的处理,有关于“MicrosoftWindows.Client.CBS_cw5n1h2txyewy”的,已解决!下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

jdk/java版本与Android源码编译中的错误

错误一:javap未指向有效的java版本 Traceback (most recent call last): File "../../base/android/jni_generator/jni_generator.py", line 1065, in <module> sys.exit(main(sys.argv)) Fi...

c# 二分查找算法

二分查找算法即折半查找,例如在一个有序数组中查找目标数应该插入到数组中的索引是多少? 假设一个数组如下: int[] nums = { 1, 3, 5, 6 }; 要计算把目标值插入到该数组中的索引值。最开始的思路: 1.先把目标数插入到数组中 2.进行排序 3.返回索引 代码如下: public int SearchInsert(int[] num...

《老罗Android开发视频教程》老罗来交国庆的答卷了

     之前在博客园、开源中国、安卓巴士发表的《老罗将死,或者Android也将就换代,但是互联网的,共享,互助精神将永存》,计划出300集免费的、高质量的、全面的Android开发视频教程,得到了很多人的支持,但是同样也遭到了一些人的质疑,说老罗是空有一翻热情,肯定会半途而废的,因此老罗决定在隔一段时间就在博客园里面给大家交个答卷,也让这些人看...

spring cloud fegin 原理解析

一、 SpringCloud 中 Feign 核心原理 如果不了解 SpringCloud 中 Feign 核心原理,不会真正的了解 SpringCloud 的性能优化和配置优化,也就不可能做到真正掌握 SpringCloud。 本章从Feign 远程调用的重要组件开始,图文并茂的介绍 Feigh 远程调用的执行流程、Feign 本地 JDK Proxy...

Android Looper详解

在Android下面也有多线程的概念,在C/C++中,子线程可以是一个函数, 一般都是一个带有循环的函数,来处理某些数据,优先线程只是一个复杂的运算过程,所以可能不需要while循环,运算完成,函数结束,线程就销毁。对于那 些需要控制的线程,一般我们都是和互斥锁相互关联,从而来控制线程的进度,一般我们创建子线程,一种线程是很常见的,那就是带有消息循环的线程...

flume使用之httpSource

flume自带很长多的source,如:exe、kafka...其中有一个非常简单的source——httpsource,使用httpSource,flume启动后会拉起一个web服务来监听指定的ip和port。常用的使用场景:对于有些应用环境中,不能部署Flume SDK及其依赖项,可以在代码中通过HTTP而不是Flume的PRC发送数据的情况,此时HT...