`

Annotation--学习:自定义annotation类型

    博客分类:
  • JAVA
阅读更多

定义Marker Annotation,也就是Annotation名称即提供信息对于程序分析工具来说,主要是检查是否有

MarkerAnnot的出现,并作出对应的动作
//用@interface来自定义一个annotation类型
//如下:用@interface来标识自定义一个annotation,而AnnotationTest为其名字
public @interface AnnotationTest {
 
}
annotation可以放在方法前面也可以放在类前面,以及属性前面,自定义的annotation与内建的

annotation使用方法是一样的。@+名字
定义带属性的annotation
public @interface AnnotationTest {
   String value();  //定义一个String类型的属性 
}
使用这个自定义的annotation时要带上参数了:@+名字("任意String类型值")
定义annotation的属性时如果属性名称为value,则使用该定义的annotation时参数直接接个String类

型的字符串就可以了。如果属性名称不是value如改成了value1,则使用时必须这样写:@+名字(定义属

性名="String类型的字符串")即:@+名字(value1="String类型值")

属性数组定义
public @interface AnnotationTest {
   String[] value();  //定义一个String数组类型的属性 
}
当使用该定义的annotation时参数大于一个时要用{}括起来
@AnnotationTest(value={"hello","word"})或者@AnnotationTest({"hello","word"})因为属性名为

value

可以给自定义的annotation属性赋个默认的值用default.
public @interface AnnotationTest {
   String value() default "hello";  //定义一个String类型的属性并赋个默认值 
}
当设置属性有默认值后,使用该annotation时可以直接使用@AnnotationTest,其参数值就是默认的值,
如果没有设置属性默认值的话不能不带参使用,会报错的.当使用时加了参数值将覆盖原来默认的值。

定义枚举类型的annotation
public @interface AnnotationTest{
 EnumTest value1();
}
enum EnumTest{
 Hello,World,Welcome;
}
使用annotation为:@AnnotationTest(value1=EnumTest.Hello)
.....
也可以为其定义属性默认值如下:
public @interface AnnotationTest{
 EnumTest value1() default EnumTest.Hello;
}
enum EnumTest{
 Hello,World,Welcome;
}
使用时直接@AnnotationTest就可以了,使用默认值。

使用@interface自行定义Annotation型态时,实际上是自动继承了java.lang.annotation.Annotation

接口,由编译程序自动为你完成了其它产生的细节。在定义Annotation型态时,不能继承其它的

Annotation型态或是接口,即自定义注解类型annotation后面不能跟任务东西了,不能继承父类,不能

去实现接口.

定义Annotation类型时也可以使用包来管理类别,方式类同于类的导入功能。即在使用的自定义

annotation时通过包的方式导入自定义annotation,如:@包名.AnnotationTest.
也可以按原来的方式写,可以通过import的方式导入annotation类.

告知编译程序如何处理@Retention
java.lang.annotation.Retention型态可以在你定义Annotaion型态时,指示编译程序如何对待你的自

定义的Annotation型态,预设上编译程序会将Annotation信息留在.class档案中,但不被虚拟机读取,

而仅用于编译程序或工具程序运行时提供信息。即注解是保存在.class文件中.通过反射的方式去读取

注解信息。
保持力策略:
在使用Retention型态时,需要提供java.lang.annotation.RetentionPolicy的枚举型态
package java.lang.annotation;
public enum RetentionPolicy
 {
     SOURCE, //编译程序处理完Annotation信息后就完成任务
     CLASS,  //编译程序将Annotation储存于class档中,缺省
     RUNTIME //编译程序将Annotation储存于class檔中,可由VM读入
}
RetentionPolicy为SOURCE的例子是@SuppressWarnings,查询API可以得到:
@Retention(value=SOURCE)
public @interface SuppressWarnings......
仅在编译时期告知编译程序来抑制警告,所以不必将这个信息储存于.class档案
RetentionPolicy为RUNTIME的时机,可以像是您使用Java设计一个程序代码分析工具,您必须让VM能读

出Annotation信息,以便在分析程序时使用
搭配反射(Reflection)机制,就可以达到这个目的
定义Annotation时必须设定RetentionPolicy为RUNTIME,也就是可以在VM中读取Annotation信息,也就

是通过反射机制来读取annotation的信息

2
1
分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics