一、Annotation 的定义格式
1. 定义简单的 Annotation
[public] @interface Annotation名称{
数据类型 变量名称();
}
使用 @interface 就相当于继承了 Annotation 接口
自定义一个 Annotation
public @interface MyDefaultAnnotationNoneParam{
}
- 1
- 2
使用 Annotation:
@MyDefaultAnnotationNoneParam
class Demo{//使用自定义的 Annotation
}
public @interface MyDefaultAnnotationNoneParam{
public String value();//定义 Annotation 接收设置的内容
public String key();
}
- 4
使用此 Annotation 时,可以将内容设置给 value
(1)在 Annotation 中设置多个属性
@MyDefaultAnnotationNoneParam(key = "Java",value = "World")
class Demo{//使用自定义的 Annotation
}
(2)建立 Annotation 并设置数组属性
public @interface MyDefaultAnnotationNoneParam{
public String[] value();//接收设置的内容是一个字符串数组
}
@MyDefaultAnnotationNoneParam(value = {"Java","World"})
class Demo{//使用自定义的 Annotation
}
[public]@interface Annotation名称{
数据类型 变量名称() default 默认值;
}
定义一个存在默认值的 Annotation:
public @interface MyDefaultAnnotationNoneParam{
public String value() default "World";
public String key() default "Java";
}
- 4
此时使用 MyDefaultAnnotationNoneParam 时,如果没有设置内容,则会将默认值赋给属性,如果已经明确给出了内容,则将给出的内容赋给属性。
4. 使用枚举限制设置的内容
在 Annotation 中也可以通过枚举来限制 Annotation 的取值范围
定义一个 MyName 的枚举
public enum MyName{//定义枚举,其中包括 3 个内容
J1,J2,J3;
}
此时在定义 MyDefaultAnnotationEnum ,此 Annotation 的取值必须是 MyName 的枚举类型:
public @interface MyDefaultAnnotationEnum {
public MyName name() default MyName.J2;//只能设置枚举中的取值,默认值为 Enum 中的内容
}
同时以后在使用 MyDefaultAnnotationEnum 时,所有的取值就必须从 MyName 这个枚举中取得。
@MyDefaultAnnotationNoneParam(value = {name = MyName.J2})//使用自定义的 Annotation
class Demo{//使用自定义的 Annotation
}
二、Retention 和 RetentionPolicy
在 Annotation 中,可使用 Retention 定义一个 Annotation 的保存范围。
此 Annotation 的定义如下:
@Documented
@Retention (value=RUNTIME)
@Target (value=ANNOTATION TYPE)
public @interface Retention{
RetentionPolicy value () ;
}
- 4
- 5
- 6
这里的 RetentionPolicy变量,用于指定 Annotation 的保存范围:
使用以上 Retention 指定一个在 RUNTIME 范围有效的 Annotation:
Override 定义采用的是@Retention(valuc= SOURCE),只能在源文件中出现。
Deprecated 定义采用的是@Retention(value=RUNTIME),可以在执行时出现。
SuppressWarnings 定义采用的是@Retention(value=SOURCE),只能在源文件中出现。
定义在 RUNTIME 范围有效的 Annotation:
@Retention(value = RetentionPolicy.RUNTIME)//此 Annotation 在执行时起作用
public @interface MyDefaultRetentionAnnotion{
public String name() default "Java";//只能设置枚举中的取值
}
- 4