#翻译#使用注解处理器生成代码-1 注解类型

 原文地址如下:摸我
 我希望以此篇博文作为基于注解处理器生成代码系列博文的开篇,给大家展示注解处理器有多么强大,并在最后使用这项技术来在编译时刻生成android代码
 在这个系列博文中,我们会:

  • 介绍Java语言中的注解
  • 理解注解的基本用法和作用域
  • 了解Annotation Processor基础知识和作用
  • 学习如何在命令行,Eclipse,Maven中运行Annotation Processors
  • 学习如何使用Annotation Processors来生成代码
  • 学习如何Apache Velocity模版来生成代码

简介

 注解首先在第三版Java Language Specification中被提出,并在java 5中被实现。
 使用注解我们可以给源代码添加元数据信息,比如构造或者部署信息,配置属性,编译特性或者代码质量检查。
 不像Javadocs,注解是强类型的,每个注解都对应一个预先定义好的注解类型。除此之外,程序可以在运行时获得注解信息,Javadocs不行。

注解语法

 注解通常出现在被注解代码片段之前,单独成行,并且和代码片段有相同的缩进。
 注解可以应用到包,类型(类,接口,枚举,注解类型),变量(对象,局部变量-包括定义在循环结构中的变量),构造函数,方法,和参数。
 注解的最简单形式是不带任何元素,比如:

@Override()
    public void theMethod() {…}

 在这种情况下,括号可以被省略。

@Override
    public void theMethod() {…}

 注解可以包括通过冒号分离的键值对数据,类型可以是基础类型,字符串,枚举,和数组:

@Author(name = "Albert",
            created = "17/09/2010",
            revision = 3,
            reviewers = {"George", "Fred"})
    public class SimpleAnnotationsTest {…}

 当注解只有一个元素并且其名字是value,那么它就可以被省略:

@WorkProduct("WP00000182")
    @Complexity(ComplexityLevel.VERY_SIMPLE)
    public class SimpleAnnotationsTest {…}

 注解可以定义它的元素的默认值,有默认值的元素可以在注解声明使用时被省略。
 比如,假设注解Author定义了revision(默认为1)和reviewers(默认为空的字符串数组),下边的两个注释声明是相同的:

@Author(name = "Albert",
            created = "17/09/2010",
            revision = 1,
            reviewers = {})
    public class SimpleAnnotationsTest() {…}
    @Author(name = "Albert",        // defaults are revision 1
            created = "17/09/2010") // and no reviewers
    public class SimpleAnnotationsTest() {…}

注解的典型使用

 有三类注解类型在Java Language Specification中被定义,它们提供给java的编译器使用:

  • @Deprecated:表明被标记的元素不应该再被使用。当你使用被标记元素时,编译器会给出警告。也可以使用在Javadoc中,解释标记元素不能在使用的原因。
  • @Override:表面被标记元素为重载了超类中的元素
  • @SuppressWarnings:让编译器忽略标记元素会产生的一些特定警告

 自从注解被引入,很多库和框架都在其最新版本中添加了注解。通过在代码中使用注解,这些库或者框架可以减少或者去除配置文件的使用。
 最有代表性的几个库或框架如下:

  • Java Enterprise Edition and its main components – Enterprise JavaBeans, Java Persistence API or Web Services API’s.
  • Spring Framework – used thoroughly for configuration, dependency injection and inversion of control in the core framework and in other Spring projects.
  • Seam, Weld, Guice.
  • Apache Struts 2.

注解类型

 注解类型(Annotation Type)是定义自定义注解的特殊接口(interface)。
 一个注解类型使用@interface来定义:

public @interface Author {
        String name();
        String created();
        int revision() default 1;
        String[] reviewers() default {};
    }
    public @interface Complexity {
        ComplexityLevel value() default ComplexityLevel.MEDIUM;
    }
    public enum ComplexityLevel {
        VERY_SIMPLE, SIMPLE, MEDIUM, COMPLEX, VERY_COMPLEX;
    }

 注解类型和常规的接口有一些不同的地方:

  • 只有基础类型,字符串,枚举,类常量和上述类型的数组允许在注解定义中使用,一般的类和对象不允许使用,双重数组也不允许。
  • 注解元素的定义语法和类方法的语法相似,但是注意,注解元素的定义不包括修饰符和参数。
  • 默认值是使用default关键字定义的,其后的值必须是字面量,数组初始器和枚举值。

 枚举类型可以在注解内部进行定义:

public @interface Complexity {
        public enum Level {
            VERY_SIMPLE, SIMPLE, MEDIUM, COMPLEX, VERY_COMPLEX;
        }
    …

用来定义注解的注解

 JDK中预先定义了一些用来修改自定义注解行为的注解:

  • @Retention:表明被标记的注解信息会保存多长时间,一些可能的值如下:CLASS (默认选项,注解信息保存到class文件中,但是无法在运行时获得), SOURCE (当class文件被创建时被编译器抛弃) and RUNTIME (在程序运行时可以获得).
  • @Target:表明注解可以标记元素的类型,可能的值为枚举类型ElementType的值:ANNOTATION_TYPE, CONSTRUCTOR, FIELD, LOCAL_VARIABLE, METHOD, PACKAGE, PARAMETER and TYPE.
     下一篇博文为《注解处理器》,稍后会给出。


(1) ”The Java Language Specification, Third Edition” is available for free download here.
 Update: new link to relevant JLS section in his new home at Oracle site here.

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 158,233评论 4 360
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 67,013评论 1 291
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 108,030评论 0 241
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 43,827评论 0 204
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 52,221评论 3 286
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,542评论 1 216
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,814评论 2 312
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,513评论 0 198
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,225评论 1 241
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,497评论 2 244
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 31,998评论 1 258
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,342评论 2 253
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 32,986评论 3 235
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,055评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,812评论 0 194
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,560评论 2 271
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,461评论 2 266

推荐阅读更多精彩内容