网站首页 > 博客文章 正文
Java语言使用@interface语法来定义注解(Annotation),它的格式如下:
public @interface Report { int type() default 0; String level() default "info"; String value() default ""; }
注解的参数类似无参数方法,可以用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 ""; }
例如,定义注解@Report可用在方法上,我们必须添加一个@Target(ElementType.METHOD):
@Target(ElementType.METHOD) public @interface Report { int type() default 0; String level() default "info"; String value() default ""; }
定义注解@Report可用在方法或字段上,可以把@Target注解参数变为数组{ ElementType.METHOD, ElementType.FIELD }:
@Target({ ElementType.METHOD, ElementType.FIELD }) public @interface Report { ... }
实际上@Target定义的value是ElementType[]数组,只有一个元素时,可以省略数组的写法。
@Repeatable
使用@Repeatable这个元注解可以定义Annotation是否可重复。这个注解应用不是特别广泛。
@Repeatable @Target(ElementType.TYPE) public @interface Report { int type() default 0; String level() default "info"; String value() default ""; }
经过@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(type=1) public class Person { }
则它的子类默认也定义了该注解:
public class Student extends Person { }
Java使用@interface定义注解:
可定义多个参数和默认值,核心参数使用value名称;
必须设置@Target来指定Annotation可以应用的范围;
应当设置@Retention(RetentionPolicy.RUNTIME)便于运行期读取该Annotation。
【关键:
- 注解的参数类似无参数方法,可以用default设定一个默认值(强烈推荐)
- 实际上@Target定义的value是ElementType[]数组,只有一个元素时,可以省略数组的写法
- 必须设置@Target和@Retention,@Retention一般设置为RUNTIME,因为我们自定义的注解通常要求在运行期读取。一般情况下,不必写@Inherited和@Repeatable
- Java使用@interface定义注解
public @interface Report { int type() default 0; String level() default "info"; String value() default ""; }
】
猜你喜欢
- 2024-10-10 开发中必须要掌握的 Git 技巧(git开源项目)
- 2024-10-10 分享几个很赞的git学习资源网(git视频教程)
- 2024-10-10 过来人告诉你,去工作前最好还是学学Git
- 2024-10-10 Github标星10.8K!Java 实战博客项目分享
- 2024-10-10 java开发转行大数据开发的学习路径
- 2024-10-10 Java入门二之Lambda 表达式(java的lambada表达式)
- 2024-10-10 大学毕业如何找到一份10K+月薪的JAVA工程师工作
- 2024-10-10 假如从5月开始学Java(java如何从零学起)
- 2024-10-10 学习廖雪峰的JAVA教程---异常处理(抛出异常)
- 2024-10-10 学习廖雪峰的JAVA教程---泛型(super通配符 super T>Pair>)
你 发表评论:
欢迎- 最近发表
-
- 给3D Slicer添加Python第三方插件库
- Python自动化——pytest常用插件详解
- Pycharm下安装MicroPython Tools插件(ESP32开发板)
- IntelliJ IDEA 2025.1.3 发布(idea 2020)
- IDEA+Continue插件+DeepSeek:开发者效率飙升的「三体组合」!
- Cursor:提升Python开发效率的必备IDE及插件安装指南
- 日本旅行时想借厕所、买香烟怎么办?便利商店里能解决大问题!
- 11天!日本史上最长黄金周来了!旅游万金句总结!
- 北川景子&DAIGO缘定1.11 召开记者会宣布结婚
- PIKO‘PPAP’ 洗脑歌登上美国告示牌
- 标签列表
-
- ifneq (61)
- messagesource (56)
- aspose.pdf破解版 (56)
- promise.race (63)
- 2019cad序列号和密钥激活码 (62)
- window.performance (66)
- qt删除文件夹 (72)
- mysqlcaching_sha2_password (64)
- ubuntu升级gcc (58)
- nacos启动失败 (64)
- ssh-add (70)
- jwt漏洞 (58)
- macos14下载 (58)
- yarnnode (62)
- abstractqueuedsynchronizer (64)
- source~/.bashrc没有那个文件或目录 (65)
- springboot整合activiti工作流 (70)
- jmeter插件下载 (61)
- 抓包分析 (60)
- idea创建mavenweb项目 (65)
- vue回到顶部 (57)
- qcombobox样式表 (68)
- vue数组concat (56)
- tomcatundertow (58)
- pastemac (61)
本文暂时没有评论,来添加一个吧(●'◡'●)