快速业务通道

Java Annotation手册 - 编程入门网

作者 佚名技术 来源 NET编程 浏览 发布时间 2012-06-17
s omitted here    @Review(grade=Review.Grade.EXCELLENT,        reviewer="df"),    @Review(grade=Review.Grade.UNSATISFACTORY,        reviewer="eg",        comment="This method needs an @Override annotation") })

annotation语法的另一个重要规则是没有程序成员可以有多于一个的同一annotation实例。例如在一个类中简单的放置多个@Review annotation。这也是在上面代码中定义@Reviews annotation类型数组的原因。

4。Annotation成员类型和值:

annotation成员必须是非空的编译时常量表达式。可用的成员类型为:primitive类型、, String, Class, enumerated类型, annotation类型, 和前面类型的数组。

下面我们定义了一个名为UncheckedExceptions 的annotation类型,它的成员是一个扩展了RuntimeException类的类数组。

清单6:

@UncheckedExceptions({    IllegalArgumentException.class, StringIndexOutOfBoundsException.class })

5。Annotation的目标:

annotation通常被放在类型定义和成员定义的前面。然而它也出现在package、方法参数、本地变量的前面。下面,我们来讨论一下这些不大常用的写法:

package annotation出现在package声明的前面。

Java Annotation手册(5)

时间:2011-05-20

下面的例子package-info.java中不包含任何的公共类型定义,却包含一个可选的javadoc注释。

清单7:

/** * This package holds my custom annotation types. */ @com.davidflanagan.annotations.Author("David Flanagan") package com.davidflanagan.annotations;

当package-info.java文件被编译时,它将产生名为包含annotation(特殊的接口)声明的package-info.class的类。这个接口没有成员,它的名字package-info不是一个合法的java标识,所以它不能用在java源代码中。这个接口的存在只是简单的被看作一个为package annotation准备的占位符。

用于修饰方法参数、catch参数、本地变量的annotation只是简单的出现在这些程序成员的修饰符位置。java类文件格式没有为本地变量或者 catch参数存储annotation作准备,所以这些annotation总是保留在源代码级别(source retention);方法参数annotation能够保存在类文件中,也可以在保留到运行时。

最后,请注意,枚举类型定义中不允许任何的修饰符修饰其枚举值。

6。Annotation和默认值:

在Annotation中,没有默认值的成员必须有一个成员值。而如何理解默认值是如何被处理就是一个很重要的细节:annotation类型所定义的成员默认值被存储在class文件中,不被编译到annotation里面。如果我们修改一个annotation类型使其成员的默认值发生了改变,这个改变对于所有此类型的annotation中没有明确提供成员值的成员产生影响(即修改了该成员的成员值)。即使在annotation类型使其成员的默认值被改变后annotation从没被重新编译过,该类型的annotation(改变前已经被编译的)也受到影响。

三、Annotation工作原理:

Annotation与反射

在java5.0中Java.lang.reflect提供的反射API被扩充了读取运行时annotation的能力。让我们回顾一下前面所讲的:一个 annotation类型被定义为runtime retention后,它才是在运行时可见,当class文件被装载时被保存在class文件中的annotation才会被虚拟机读取。那么 reflect是如何帮助我们访问class中的annotation呢?

下文将在java.lang.reflect用于annotation的新特性,其中 java.lang.reflect.AnnotatedElement是重要的接口,它代表了提供查询annotation能力的程序成员。

这个接口被 java.lang.Package、java.lang.Class实现,并间接地被Method类、Constructor类、 java

凌众科技专业提供服务器租用、服务器托管、企业邮局、虚拟主机等服务,公司网站:http://www.lingzhong.cn 为了给广大客户了解更多的技术信息,本技术文章收集来源于网络,凌众科技尊重文章作者的版权,如果有涉及你的版权有必要删除你的文章,请和我们联系。以上信息与文章正文是不可分割的一部分,如果您要转载本文章,请保留以上信息,谢谢!

分享到: 更多

Copyright ©1999-2011 厦门凌众科技有限公司 厦门优通互联科技开发有限公司 All rights reserved

地址(ADD):厦门软件园二期望海路63号701E(东南融通旁) 邮编(ZIP):361008

电话:0592-5908028 传真:0592-5908039 咨询信箱:web@lingzhong.cn 咨询OICQ:173723134

《中华人民共和国增值电信业务经营许可证》闽B2-20100024  ICP备案:闽ICP备05037997号