(Java)自定义 Annotation

一、Annotation 的定义格式

1. 定义简单的 Annotation

[public] @interface Annotation名称{
	数据类型 变量名称();
}

使用 @interface 就相当于继承了 Annotation 接口

自定义一个 Annotation

public @interface MyDefaultAnnotationNoneParam{
}

使用 Annotation:

@MyDefaultAnnotationNoneParam
class Demo{//使用自定义的 Annotation
}

2. 向 Annotation 中设置内容

public @interface MyDefaultAnnotationNoneParam{
	public String value();//定义 Annotation 接收设置的内容
	public String key();
}

使用此 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
}

3. 默认值

只要在定义 Annotation 时设置了属性,就必须在使用时设置其内容,为了方便使用,也可以在定义 Annotation 属性时指定其默认值:

[public]@interface Annotation名称{
	数据类型 变量名称() default 默认值;
}

定义一个存在默认值的 Annotation:

public @interface MyDefaultAnnotationNoneParam{
	public String value() default "World";
	public String key() default "Java";
}

此时使用 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 () ;
}

这里的 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";//只能设置枚举中的取值
}
发布了613 篇原创文章 · 获赞 276 · 访问量 24万+

猜你喜欢

转载自blog.csdn.net/nanhuaibeian/article/details/104464828