当前位置: 首页 > article >正文

Java可重复注解接口(Repeatable Annotation Interfaces)

Java规范参考

详细的解释可以参考Java规范:
https://docs.oracle.com/javase/specs/jls/se19/html/jls-9.html#jls-9.6.3

可重复注解接口介绍

  • 可重复注解接口是从Java 1.8版本引入的,表示可以重复出现。
  • 一个可重复注解接口A用@Repeatable修饰,并且@Repeatable的元素value 的值指明了一个A的容器注解接口。
  • 容器注解接口必须声明一个value()方法,它的返回类型是可重复注解接口类型的数组,例如A[]。
  • 在容器注解接口中声明的其它不同于value()的方法,必须有一个默认值。

例如,定义了一个可重复注解接口Name:

package com.thb;

import static java.lang.annotation.ElementType.FIELD;
import static java.lang.annotation.ElementType.TYPE;
import static java.lang.annotation.RetentionPolicy.CLASS;

import java.lang.annotation.Documented;
import java.lang.annotation.Repeatable;
import java.lang.annotation.Retention;
import java.lang.annotation.Target;

@Documented
@Retention(CLASS)
@Target({ TYPE, FIELD })
@Repeatable(Names.class)
public @interface Name {
    String value();
}

定义可重复注解Name接口的容器注解接口Names:

package com.thb;

import static java.lang.annotation.ElementType.FIELD;
import static java.lang.annotation.ElementType.TYPE;
import static java.lang.annotation.RetentionPolicy.RUNTIME;

import java.lang.annotation.Documented;
import java.lang.annotation.Retention;
import java.lang.annotation.Target;

@Documented
@Retention(RUNTIME)
@Target({ TYPE })
public @interface Names {
    Name[] value();
}
  • 容器注解接口的保留范围要至少跟可重复注解接口一样长。保留范围用@Retention显式或者隐式声明。
    1)如果容器注解接口的保留范围是java.lang.annotation.RetentionPolicy.SOURCE,那么可重复注解接口的保留范围只能是java.lang.annotation.RetentionPolicy.SOURCE。
    2)如果容器注解接口的保留范围是java.lang.annotation.RetentionPolicy.CLASS,那么可重复注解接口的保留范围可以是java.lang.annotation.RetentionPolicy.CLASS、或者java.lang.annotation.RetentionPolicy.SOURCE。
    3)如果容器注解接口的保留范围是java.lang.annotation.RetentionPolicy.RUNTIME,那么可重复注解接口的保留范围可以是java.lang.annotation.RetentionPolicy.SOURCE、或者java.lang.annotation.RetentionPolicy.CLASS、或者java.lang.annotation.RetentionPolicy.RUNTIME。

  • 可重复注解接口可以应用的程序元素类型(用@Target指明),至少要和容器注解接口可以应用的元素类型相同。假设可重复注解接口可以应用的程序元素类型集合是m1,容器注解接口可以应用的程序元素类型集合是m2,那么m2中的每个类型都必须在m1中出现,除非:
    1)如果m2中的类型是java.lang.annotation.ElementType.ANNOTATION_TYPE,那么下面三种类型必须在m1中至少出现一个:java.lang.annotation.ElementType.ANNOTATION_TYPE、 或者 java.lang.annotation.ElementType.TYPE、或者 java.lang.annotation.ElementType.TYPE_USE
    2)如果m2中的类型是java.lang.annotation.ElementType.TYPE,那么下面两种类型必须在m1中至少出现一个:java.lang.annotation.ElementType.TYPE、或者java.lang.annotation.ElementType.TYPE_USE。
    3)如果m2中的类型是java.lang.annotation.ElementType.TYPE_PARAMETER,那么下面两种类型必须在m1中至少出现一个:java.lang.annotation.ElementType.TYPE_PARAMETER、或者java.lang.annotation.ElementType.TYPE_USE。

  • 如果可重复注解接口用java.lang.annotation.Documented注解修饰,那么容器注解接口也必须用java.lang.annotation.Documented修饰。注:但容器注解接口用java.lang.annotation.Documented修饰,可重复注解接口可以不用java.lang.annotation.Documented注解修饰

  • 如果可重复注解接口用java.lang.annotation.Inherited注解修饰,那么容器注解接口也必须用java.lang.annotation.Inherited修饰。注:但容器注解接口用java.lang.annotation.Inherited修饰,可重复注解接口可以不用java.lang.annotation.Inherited注解修饰

  • @Repeatable语句不能重复出现,因此一个可重复注解接口(即被@Repeatable修饰)只能有一个容器注解接口。

  • 一个注解接口最多只能是一个注解接口的容器注解接口。

  • 一个注解接口不能声明是它本身的容器注解接口。

  • 一个容器注解接口可以有自己的容器注解接口,即:容器注解接口本身也可以是可重复注解接口。


http://www.kler.cn/a/105969.html

相关文章:

  • leetcode-44-通配符匹配
  • HBase 开发:使用Java操作HBase
  • 【算法】【优选算法】前缀和(下)
  • 定时器简介
  • Ubuntu22.04LTS 部署前后端分离项目
  • 录的视频怎么消除杂音?从录制到后期的杂音消除攻略
  • 软件测试肖sir__python之ui自动化测试框架作业案例
  • 关于接口|常见电商API接口种类|接口数据类型|接口请求方法
  • OpenText 安全取证软件——降低成本和风险的同时,简化电子取证流程
  • 【反射】Java反射机制 -- 常用构造器与方法
  • componentDidMount只执行一次的解决方法
  • 【软件测试】超细HttpRunner接口自动化框架使用案例,一篇策底打通...
  • 更换网络ip地址怎么设置
  • Pytorch使用torchvision.datasets.ImageFolder读取数据集,数据集的内容排列状况
  • 如何使用SpringBoot处理全局异常
  • MySQL不常用查询
  • Linux下的文件操作和文件管理
  • 微信小程序获取数据的方法——iBeacon蓝牙
  • Adversarial attacks and defenses on AI in medical imaging informatics: A survey
  • Easysearch 容量规划建议
  • OkHttp网络框架深入理解-SSL握手与加密
  • 雪糕冰淇淋经营配送小程序商城效果如何
  • 【Python机器学习】零基础掌握VotingClassifier集成学习
  • 在线设计数据库表用Itbuilder,极简易用真香!!!
  • 基于Jsp+Servlet+MySql的汉服网站的设计与实现-源码+毕业论文
  • 算法工程师-机器学习-数据科学家面试准备4-ML系统设计