iis服务器助手广告广告
返回顶部
首页 > 资讯 > 后端开发 > JAVA >Java|注解之定义注解
  • 353
分享到

Java|注解之定义注解

java 2023-09-14 09:09:02 353人浏览 安东尼
摘要

Java语言使用@interface语法来定义注解(Annotation),它的格式如下: public @interface Report { int type() default 211; String level() de

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

来源地址:https://blog.csdn.net/weixin_67497686/article/details/129351220

--结束END--

本文标题: Java|注解之定义注解

本文链接: https://www.lsjlt.com/news/407001.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作