0


Java|注解之定义注解

Java语言使用

@interface

语法来定义注解(

Annotation

),它的格式如下:

public @interface Report {
    int type() default 211;
    String level() default "211";
    String value() default "211";
}

注解的参数类似无参数方法,可以用

default

设定一个默认值(强烈推荐)。最常用的参数应当命名为

value

元注解

有一些注解可以修饰其他注解,这些注解就称为元注解(meta annotation)。Java标准库已经定义了一些元注解,我们只需要使用元注解,通常不需要自己去编写元注解。

@Target

最常用的元注解是

@Target

。**使用

@Target

可以定义

Annotation

能够被应用于源码的**哪些位置:

  • 类或接口:ElementType.TYPE
  • 字段:ElementType.FIELD
  • 方法:ElementType.METHOD
  • 构造方法:ElementType.CONSTRUCTOR
  • 方法参数:ElementType.PARAMETER

例如,要使 注解

@Report

可用在方法上,我们必须添加一个

@Target(ElementType.METHOD)

@Target(ElementType.METHOD)
public @interface Report {
    int type() default 0;
    String level() default "info";
    String value() default "";
}
//@Target(ElementType.METHOD) 表明注解Report 可以放在 类的方法前

定**义注解

@Report

可用在方法或字段上,可以把

@Target

注解参数变为**数组

{ ElementType.METHOD, ElementType.FIELD }

@Target({
    ElementType.METHOD,
    ElementType.FIELD
})
public @interface Report {
    ...
}

@Retention

另一个重要的**元注解

@Retention

定义了

Annotation

的生命周期**:

  • 编译期:RetentionPolicy.**SOURCE**
  • class文件:RetentionPolicy.**CLASS**
  • 运行期:RetentionPolicy.RUNTIME

**如果

@Retention

不存在,则该

Annotation

默认为

CLASS

。**因为通常我们自定义的

Annotation

都是

RUNTIME

,所以,务必要加上

@Retention(RetentionPolicy.RUNTIME)

这个元注解:

@Retention(RetentionPolicy.RUNTIME)
public @interface Report {
    int type() default 0;
    String level() default "info";
    String value() default "";
}

@Repeatable

使用

@Repeatable

这个元注解可以定义

Annotation

是否可重复。这个注解应用不是特别广泛。

@Repeatable(Reports.class)
@Target(ElementType.TYPE)
public @interface Report {
    int type() default 0;
    String level() default "info";
    String value() default "";
}

@Target(ElementType.TYPE)
public @interface Reports {
    Report[] value();
}

经过

@Repeatable

修饰后,在某个类型声明处,就可以添加多个

@Report

注解:

@Report(type=1, level="debug")
@Report(type=2, level="warning")
public class Hello {
}

@Inherited

使用

@Inherited

定义子类是否可继承父类定义的

Annotation

@Inherited

仅针对

@Target(ElementType.TYPE)

类型的

annotation

有效,并且仅针对

class

的继承,对

interface

的继承无效:

@Inherited
@Target(ElementType.TYPE)
public @interface Report {
    int type() default 0;
    String level() default "info";
    String value() default "";
}
//Report注解 可以放在 类定义的前面  且父类有Report注解的话,
可被子类继承该注解 

在使用的时候,如果一个类用到了

@Report

@Report(type=1)
public class Person {
}

则它的子类默认也定义了该注解:

public class Student extends Person {
}

如何定义Annotation

我们总结一下定义

Annotation

的步骤:

第一步,用

@interface

定义注解:

public @interface Report {
}

第二步,添加参数、默认值:

public @interface Report {
    int type() default 0;
    String level() default "info";
    String value() default "";
}

把最常用的参数定义为

value()

,推荐所有参数都尽量设置默认值。

第三步,用元注解配置注解

@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
public @interface Report {
    int type() default 0;
    String level() default "info";
    String value() default "";
}

其中,**必须设置

@Target

@Retention

**,

@Retention

一般设置为

RUNTIME

,因为我们自定义的注解通常要求在运行期读取。一般情况下,不必写

@Inherited

@Repeatable

(Target元注解 表明定义的注解能放什么位置;Retention元注解 表明定义的注解的生命周期)

小结

Java使用

@interface

定义注解:

可定义多个参数和默认值,核心参数使用

value

名称;

必须设置

@Target

来指定

Annotation

可以应用的范围;

应当设置

@Retention(RetentionPolicy.RUNTIME)

便于运行期读取该

Annotation

标签: java

本文转载自: https://blog.csdn.net/weixin_67497686/article/details/129351220
版权归原作者 往797 所有, 如有侵权,请联系我们删除。

“Java|注解之定义注解”的评论:

还没有评论