自定义annotation类型
来源:优易学  2011-12-13 13:34:00   【优易学:中国教育考试门户网】   资料下载   IT书店
  定义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型态,预设上编译程序峤獳nnotation信息留在.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的信息。

责任编辑:小草

文章搜索:
 相关文章
热点资讯
资讯快报
热门课程培训