Annotation, Multi-valued annotation, nested annotation, 多值注解, 嵌套注解

今天在研究Spring MVC的Validation机制时(这里 | 还有这里),简单看了下一些注解的源码,比如@Min,发现以前从来没注意到的注解写法。看来基础知识有疏漏啊...

/**

* Validate a zipcode for a given country

* The only supported type is String

*/

@Documented

@Constraint(validatedBy = ZipCodeValidator.class)

@Target({ METHOD, FIELD, ANNOTATION_TYPE, CONSTRUCTOR, PARAMETER })

@Retention(RUNTIME)

public @interface ZipCode {

String countryCode();

String message() default "{com.acme.constraint.ZipCode.message}";

Class>[] groups() default {};

Class extends Payload>[] payload() default {};

/**

* Defines several @ZipCode annotations on the same element

* @see (@link ZipCode}

*/

@Target({ METHOD, FIELD, ANNOTATION_TYPE, CONSTRUCTOR, PARAMETER })

@Retention(RUNTIME)

@Documented

@interface List {

ZipCode[] value();

}

}

这是一个对邮政编码进行验证的一个注解,注解内又好像多了个类似内部类一样的内部注解(自己造的术语_),或者说嵌套注解, 先说这个注解的用法

public class Address {

@ZipCode.List( {

@ZipCode(countryCode="fr", groups=Default.class

message = "zip code is not valid"),

@ZipCode(countryCode="fr", groups=SuperUser.class

message = "zip code invalid. Requires overriding before saving.")

} )

private String zipcode;

}

总结一下,这类注解的作用是解决Java不支持多重重复注解问题的,比如如下的重复注解是编译不过的!

@Metadata(name="size (KB)", value="1024")

@Metadata(name="size (MB)", value="1")

@Test

public void myPerfTest(){ // do stuff}

javac 编译输出:

./org/junitbench/examples/MetadataTest.java:[23, 18] duplicate annotation

另外,Java反射API不支持根据名字来获取多个注解

(see: java.lang.reflect.AnnotatedElement.getAnnotation(…)). 如果语义上显性支持的话我们就可以在注解的过滤器中获取到这些信息了。但既然Java不支持,那我们就需要寻求一个替代方案。通过定义一个封装的注解类型,让它可以接受不限数量的嵌入注解即可。

@Metadata(

{

@Data(name="size (KB)", value="1024"),

@Data(name="size (MB)", value="1")

})

@Test

public void myPerfTest(){ // do stuff}```

该注解是这样定义的:

@Inherited

@Retention(RetentionPolicy.RUNTIME)

@Target({})

public @interface Data{

String name();

String value();

}```

@Inherited

@Retention(RetentionPolicy.RUNTIME)

@Target({ElementType.METHOD})

public @interface Metadata{

Data[] value();

}

该用法的重点就是内部嵌入的注解是作为集合的形式出现(数组或者文章最开始的List均可实现)。

java interface list_你了解注解内的@interface List么相关推荐

  1. Java知识点总结(注解-内置注解)

    Java知识点总结(注解-内置注解) @(Java知识点总结)[Java, 注解] @Override 定义在java.lang.Override 中,此注释只适用于修饰方法,表示一个方法声明打算重写 ...

  2. 注解和反射详细笔记。自定义注解,元注解,内置注解。反射机制,Java Reflection,Java内存分析,反射操作注解,java.lang.reflect.Method,Class

    文章目录 注解 什么是注解 内置注解 元注解 自定义注解 反射机制 静态语言 vs 静态语言 Java Reflection 反射相关的主要API Class类 Java内存分析 创建运行时类的对象 ...

  3. java annotation入门_JAVA - Annotation 注解 入门

    Java注解提供了关于代码的一些信息,但并不直接作用于它所注解的代码内容.在这个教程当中,我们将学习Java的注解,如何定制注解,注解的使用以及如何通过反射解析注解. Java1.5引入了注解,当前许 ...

  4. Java泛型,枚举,注解

    Java泛型,枚举,注解 1 泛型 1.1 什么是泛型 泛型:即参数化类型.在不创建新的类型的情况下,通过泛型指定的不同类型来控制形参具体限制的类型.允许在定义类.接口时通过一个标识表示类中某个属性的 ...

  5. java中为什么要用注解_java中的注解,真的很重要,你理解了嘛?

    这篇文章开始讲解java中的注解,在平时的开发当中我相信你或多或少的接触过注解.比如你可能都见过@override,它代表的就是一个注解.但是,为了更加清晰的去介绍注解,我还是先给出一个例子,让你能够 ...

  6. Java面向对象编程篇6——注解与反射

    Java面向对象编程篇6--注解与反射 1.注解概述 Java 注解(Annotation)又称 Java 标注,是 JDK5.0 引入的一种注释机制 Java 语言中的类.方法.变量.参数和包等都可 ...

  7. Java知识点详解 6 注解

    一.注解简介 Java注解用于为Java代码提供元数据. 元数据是指用来描述数据的数据,通俗一点,就是描述代码间关系,或者代码与其它资源(例如数据库表)之间内在联系的数据.在一些技术框架中,如Stru ...

  8. 夯实Java基础(十七)——注解(Annotation)

    1.注解概述 从JDK5.0开始,Java增加对元数据(MetaData)的支持,也就是注解(Annotation).其实我们早就已经接触过注解了,例如我们经常在Java代码中可以看到 "@ ...

  9. Java内功修炼系列:注解(Annotation)

    目录 一 注解的定义 二 如何自定义注解 三 元注解 3.1 @Retention 3.2 @Target 3.3 @Documented 3.4 @Inherited 3.5 @Repeatable ...

最新文章

  1. python 将字符串转换成字典dict
  2. 分区表--SQLServer创建分区表
  3. solr配置-Schema.xml
  4. 额外篇| Python制作词云
  5. 平板电脑安装软件_概述嵌入式工业平板电脑的安装方法和注意事项!
  6. pandans导出Excel并将数据保存到不同的Sheet表中
  7. C# WPF MVVM开发框架Caliburn.Micro 名称Transformer⑩①
  8. 【转】DPDK(一):专业术语
  9. CentOS 7 怎样安装或升级最新的内核?
  10. python3安装包是说解压数据出错怎么办_无法修复“zipimport.zipimporter错误:无法解压缩数据;键入python3.6时zlib不可用获取pip.py...
  11. ArcGIS Maritime Server 开发教程(三)Maritime Service 功能解读
  12. Excel的基本操作(一):保护功能、快速输入数据、导入txt数据和导入Access数据库、Excel数据类型等基本操作
  13. 使用 k3d 来运行极狐GitLab Runner
  14. Git出现 Your local changes to the following files would be overwritten by merge: con
  15. 2023昆明理工大学计算机考研信息汇总
  16. Linux递归修改后缀名
  17. 自制BSL编程MSP430单片机
  18. 深度学习的发展历史是什么?
  19. C语言试题164之求定积分
  20. 自然语言处理NLP面试问题

热门文章

  1. 使用c++filt查看trafficserver堆栈调用信息
  2. JavaScript闭包函数箭头函数调用与执行
  3. 转载iOS开发中常见的警告及错误
  4. 数据库打开报错: 值不能为空
  5. 创建DLL动态链接库——声明导出法
  6. 关于GridView手动绑定的一段代码,一切尽在不言中
  7. Platform Builder 5下WinCE 5.0目录结构
  8. 六步使用ICallbackEventHandler实现无刷新回调
  9. linux动态库命名规则
  10. Flex报错Error #2048: 安全沙箱冲突