ASP源码.NET源码PHP源码JSP源码JAVA源码DELPHI源码PB源码VC源码VB源码Android源码
当前位置:首页 >> 低调看直播体育app软件下载 >> Android开发 >> Java Android Annotation深入理解

Java Android Annotation深入理解(3/3)

来源:网络整理     时间:2015-11-15     关键词:Exception,Annotation

本篇文章主要介绍了"Java Android Annotation深入理解",主要涉及到Exception,Annotation方面的内容,对于Android开发感兴趣的同学可以参考一下: 一、概念 Annontation是Java5开始引入的新特征。中文名称一般叫注解。它提供了一种安全的类注释的机制,用来将任何的信息或元数据(met...

@com.cn.Annotation.test0.CustomizedAnnatation(name=RanderC)
RanderC
@com.cn.Annotation.test0.CustomizedAnnatation(name=10岁)
10岁
@com.cn.Annotation.test0.CustomizedAnnatation(name=hello world)
hello world

从结果可以看出,注解的变量可以在运行时解析到,那要跟当前对象的成员变量绑定起来当然也是可能咯。像ButterKnife这种框架,直接通过Annotation能够将布局控件和关联绑定起来,省去了findViewById的事了。但不同的是ButterKnife这种框架是编译是注解,而非上面例子是运行时。

七、解析Annotation

解析Annotation包括运行时解析和变异是解析,通过上一个例子我们定义的是运行是解析的。
1.运行时解析
(1) 运行时 Annotation 指 @Retention 为 RUNTIME 的 Annotation,可手动调用下面常用 API 解析
method.getAnnotation(AnnotationName.class);
method.getAnnotations();
method.isAnnotationPresent(AnnotationName.class);

其他 @Target 如 Field,Class 方法类似
getAnnotation(AnnotationName.class) 表示得到该 Target 某个 Annotation 的信息,因为一个 Target 可以被多个 Annotation 修饰
getAnnotations() 则表示得到该 Target 所有 Annotation
isAnnotationPresent(AnnotationName.class) 表示该 Target 是否被某个 Annotation 修饰
(2) 解析示例如下:
public static void main(String[] args) {
    try {
        Class cls = Class.forName("cn.trinea.java.test.Annotation.App");
        for (Method method : cls.getMethods()) {
            MethodInfo methodInfo = method.getAnnotation(
MethodInfo.class);
            if (methodInfo != null) {
                System.out.println("method name:" + method.getName());
                System.out.println("method author:" + methodInfo.author());
                System.out.println("method version:" + methodInfo.version());
                System.out.println("method date:" + methodInfo.date());
            }
        }
    } catch (ClassNotFoundException e) {
        e.printStackTrace();
    }
}
2.编译时的解析
(1) 编译时 Annotation 指 @Retention 为 CLASS 的 Annotation,甴 apt(Annotation Processing Tool) 解析自动解析。需要做的
a. 自定义类集成自 AbstractProcessor
b. 重写其中的 process 函数
apt(Annotation Processing Tool) 在编译时自动查找所有继承自 AbstractProcessor 的类,然后调用他们的 process 方法去处理。
Android的ButterKnife注解框架就是这么干的。
(2) 假设之前自定义的 MethodInfo 的 @Retention 为 CLASS,解析示例如下:
@SupportedAnnotationTypes({ "cn.trinea.java.test.Annotation.MethodInfo" })
public class MethodInfoProcessor extends AbstractProcessor {

    @Override
    public boolean process(Set Annotations, RoundEnvironment env) {
        HashMap map = new HashMap();
        for (TypeElement te : Annotations) {
            for (Element element : env.getElementsAnnotatedWith(te)) {
                MethodInfo methodInfo = element.getAnnotation(MethodInfo.class);
                map.put(element.getEnclosingElement().toString(), methodInfo.author());
            }
        }
        return false;
    }
}
SupportedAnnotationTypes 表示这个 Processor 要处理的 Annotation 名字。
process 函数中参数 Annotations 表示待处理的 Annotations,参数 env 表示当前或是之前的运行环境
process 函数返回值表示这组 anotations 是否被这个 Processor 接受,如果接受后续子的 rocessor 不会再对这个 Annotations 进行处理。

以上就介绍了Java Android Annotation深入理解,包括了Exception,Annotation方面的内容,希望对Android开发有兴趣的朋友有所帮助。

本文网址链接:http://www.codes51.com/article/detail_219721_3.html

相关图片

相关文章