J2SE 5.0提供对元数据的支持,这种元数据称为注释(Annotation)。通过使用注释,程序员可以在不改变原有逻辑的情况下,在源文件潜入一些补充信息。
1、Annotation:用来修饰类、属性、方法,而且不影响程序运行。java.lang.annotation.Annotation是Annotation的接口,只要是Annotation都必须实现此接口。
Annotation有:系统内建的Annotation和用户自定义的Annotation
2、系统内建的Annotation(都在java.lang包中定义):
@Override:覆写的Annotation
@Deprecated:不赞成使用的Annotation
@SuppressWarnings:压制安全警告的Annotation
(1)、@Override:只在方法覆写时使用,用于保证方法覆写的正确性。
(2)、@Deprecated:用于声明一个不建议使用的方法或类,如果在程序中使用了此方法和类,则在编程时将会出现警告信息但是程序依然会正常执行。
(3)、@SuppressWarnings:用于压制警告。当需要压制多个警告信息时,可以按照数组的格式进行操作。在设置注释信息时,是以“key->value”形式出现也可使使用“value={“关键字1”,“关键字2”}”的方式设置。
3、 自定义Annotation
(1)、定义格式:[public] @interface Annotation 名称{
数据类型 变量名称();
}
在定义Annotation必须使用@interface的方式进行定义,可以定义各种变量,但变量定义之后必须有“()”。
(2)、向变量中设置内容
指定一个属性时:直接设置内容,也可以通过指定接受的属性名
指定多个属性时:指定属性名方式
一个属性设置多个内容:将一个属性定义成数组
直接设置内容 | 指定属性名方式 | 一个属性设置多个内容 |
public @interface MyDefaultAnnotationSingleParam { public String key(); }
@MyDefaultAnnotationSingleParam("李星华"); class Demo { } | public @interface MyDefaultAnnotationMoreParam { public String key(); public String value(); }
@MyDefaultAnnotationMoreParam(key="MLDN",value="李星华"); class Demo { } | public @interface MyDefaultAnnotationArrayParam { public String[] value(); } @MyDefaultAnnotationArrayParam(value={"MLDN","李星华"}) class Demo { } |
(3)、默认值:只要定义Annotation时设置了属性,必须使用时设置内容否则在编译时会出现错误。为了方便可以指定默认值。
格式:[public] @interface Annotation 名称{
数据类型 变量名() default 默认值;
}
(4)、使用枚举限制设置内容
定义枚举 |
|
|
public enum MyName{ MLDN,LXH,LI; }
| public @interface MyDefaultAnnotationEnum { public MyName name()default Myname.LXH; } | @MyDefaultAnnotationEnum(name=MyName.Li) class Demo { } |
4、Retention定义Annotation的保存范围。
RetentionPolicy是Retention中存在的一个变量。
RetentionPolicy包含的三个范围 |
|
SOURCE (Override采用) | 信息只会保存在程序源文件中(*.java),编译之后不会保存在编译好的文件中(*.class) |
CLASS (Deprecated采用) | 信息保存在程序源文件中(*.java)和编译之后的类文件中(*.class)。使用时不会加载到虚拟机(JVM)中(没有指定范围时默认为此) |
RUNTIME (SuppressWarnings采用) | 信息保留在源文件(*.java)、类文件(*.class)、执行时加载到JVM中 |
若要一个Annotation起作用必须结合Java中的反射机制。
5、Annotation的应用
如果一个Annotation没有明确指明定义的位置,则可以在任意位置使用。
(1)如果想一个Annotation只能在指定位置使用,则必须使用@Target注释。
@Target可以接收一个ElementType数组,则其可以同时设置多个Annotation的出现位置。
(2)@Documented注释可以用在任何一个Annotation上。
使用@Documented注释后,此Annotation在生成java doc时就可以加入类或方法的一些说明信息。
(3)@Inherited用于标注一个父类的注释是否可以被子类所继承,如果一个Annotation需要被其子类所继承,则在声明时直接使用@Inherited注释即可。