重复注解

Java8以前,同一个程序元素前最多只能使用一相同类型的注解;如果需要在同一个元素前使用多个相同类型的注解,则必须使用注解"容器"。例如在Struts开发中,有时需要在 Action 类上使用多个@Result注解。在 Java8 以前只能写成如下形式:
@Results({
@Result(name="failure", location="failed.jsp"),
@Result(name="success ", location ="succ.jsp")
})
public Acton FooAction{ ... }

java8以后可以这样写

@Result(name="failure", location="failed.jsp"),
@Result(name="success ", location ="succ.jsp")
public Acton FooAction{ ... }

可重复注解的开发流程

1,首先定义我们需要重复的注解(@Repeatable(ActionTodos.class)就表示我们的注解是可重复的,并且重复的容器是ActionTodos

package com.zmd.repeatAnotation;

import java.lang.annotation.*;

/**
* @ClassName ActionTodo
* @projectName: object1
* @author: Zhangmingda
* @description: 可重复注解
* date: 2021/5/19.
*/
//@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
@Repeatable(ActionTodos.class)
public @interface ActionTodo {
String actionListenerName();
}
2,容器注解定义:

package com.zmd.repeatAnotation;

import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target; /**
* @ClassName ActionTodos
* @projectName: object1
* @author: Zhangmingda
* @description: 容器注解
* date: 2021/5/19.
*/
//容器
@Retention(RetentionPolicy.RUNTIME)
//@Target(ElementType.TYPE)
public @interface ActionTodos {
ActionTodo[] value();
}

3,具体的使用:

package com.zmd.repeatAnotation;

import javax.swing.*;
import java.lang.annotation.Annotation;
import java.lang.reflect.Field; /**
* @ClassName UseRepeatable
* @projectName: object1
* @author: Zhangmingda
* @description: XXX
* date: 2021/5/19.
*/
@ActionTodo(actionListenerName = "打鸟")
@ActionTodo(actionListenerName = "掏蛋")
@ActionTodo(actionListenerName = "煮着吃")
public class UseRepeatable {
@ActionTodo(actionListenerName = "打鸟")
@ActionTodo(actionListenerName = "掏蛋")
@ActionTodo(actionListenerName = "煮着吃")
private static JButton okButton = new JButton("一石N鸟");
public static void main(String[] args) throws NoSuchFieldException {
/**
* 获取注解容器
*/
Annotation[] annotations = UseRepeatable.class.getAnnotations();
for (Annotation annotation : annotations){ //获取所有注解,包含容器注解
System.out.println(annotation); //获取所有注解,包含容器注解
} Field okbtnField = UseRepeatable.class.getDeclaredField("okButton");
Annotation[] actions = okbtnField.getAnnotations(); //获取所有注解,包含容器注解
//ActionTodo[] actions = okbtnField.getAnnotationsByType(ActionTodo.class); //可重复注解
for (Annotation actionTodo :actions) {
System.out.println(actionTodo);
}
/**
* 获取注解类的重复注解
*/
ActionTodo[] actionTodos = UseRepeatable.class.getAnnotationsByType(ActionTodo.class);
for (ActionTodo actionTodo : actionTodos){
System.out.println(actionTodo);
}
/**
* 获取属性(类变量)的重复注解
*/
//获取变量反射对象
Field[] fields = UseRepeatable.class.getDeclaredFields();
//循环判断
for (Field field:fields){
field.setAccessible(true);
//是否被容器注解修饰
if (field.isAnnotationPresent(ActionTodos.class)){
//获取注解列表
ActionTodo[] actionTodos1 = field.getAnnotationsByType(ActionTodo.class);
for (ActionTodo actionTodo:actionTodos1){
System.out.println(actionTodo);
}
}
}
}
}

测试使用输出

@com.zmd.repeatAnotation.ActionTodos(value={@com.zmd.repeatAnotation.ActionTodo(actionListenerName="打鸟"), @com.zmd.repeatAnotation.ActionTodo(actionListenerName="掏蛋"), @com.zmd.repeatAnotation.ActionTodo(actionListenerName="煮着吃")})
@com.zmd.repeatAnotation.ActionTodos(value={@com.zmd.repeatAnotation.ActionTodo(actionListenerName="打鸟"), @com.zmd.repeatAnotation.ActionTodo(actionListenerName="掏蛋"), @com.zmd.repeatAnotation.ActionTodo(actionListenerName="煮着吃")})
@com.zmd.repeatAnotation.ActionTodo(actionListenerName="打鸟")
@com.zmd.repeatAnotation.ActionTodo(actionListenerName="掏蛋")
@com.zmd.repeatAnotation.ActionTodo(actionListenerName="煮着吃")
@com.zmd.repeatAnotation.ActionTodo(actionListenerName="打鸟")
@com.zmd.repeatAnotation.ActionTodo(actionListenerName="掏蛋")
@com.zmd.repeatAnotation.ActionTodo(actionListenerName="煮着吃")

 

java 编程基础 注解 :可重复的注解的更多相关文章

  1. Java入门——(1)Java编程基础

    Java入门--(1)Java编程基础 第二章 Java编程基础   JAVA 代码的基本格式: 修饰符 class 类名{ 程序代码 }   2.1关键字:赋予了特殊含义的单词.   2.2标识符: ...

  2. Java编程基础——流程控制

    Java编程基础——流程控制 摘要:本文主要介绍Java编程中的流程控制语句. 分类 流程控制指的是在程序运行的过程中控制程序运行走向的方式.主要分为以下三种: 顺序结构:从上到下依次执行每条语句操作 ...

  3. Java编程基础——标识符和关键字

    Java编程基础——标识符和关键字 摘要:本文主要介绍标识符和关键字. 标识符 是什么 Java语言中,为各种变量.方法.类和包等起的名字,统统称之为Java标识符. 命名规则 ◆ 应以字母.下划线. ...

  4. Java开发知识之Java编程基础

    Java开发知识之Java编程基础 一丶Java的基础语法 每个语言都有自己的语法规范.例如C++ 入口点是main. 我们按照特定格式编写即可. Java也不例外. Java程序的语法规范就是 Ja ...

  5. java编程基础二进制

    0.java编程基础 01.二进制(原码,反码,补码) 02.位运算 03.移位运算符 二进制 原码,反码,补码 1.基本概念 二进制是逢2进位的进位制,0,1是基本算符. 现在的电子计算机技术全部使 ...

  6. Java编程基础-面向对象(中)

    本章承接Java编程基础-面向对象(上)一文. 一.static关键字 在java中,定义了一个static关键字,它用于修饰类的成员,如成员变量.成员方法以及代码块等,被static修饰的成员具备一 ...

  7. Java编程基础——数组和二维数组

    Java编程基础——数组和二维数组 摘要:本文主要对数组和二维数组进行简要介绍. 数组 定义 数组可以理解成保存一组数的容器,而变量可以理解为保存一个数的容器. 数组是一种引用类型,用于保存一组相同类 ...

  8. Java编程基础——运算符和进制

    Java编程基础——运算符和进制 摘要:本文主要介绍运算符和进制的基本知识. 说明 分类 Java语言支持如下运算符: ◆ 算术运算符:++,--,+,-,*,/,%. ◆ 赋值运算符:=,+=,-= ...

  9. Java编程基础——常量变量和数据类型

    Java编程基础——常量变量和数据类型 摘要:本文介绍了Java编程语言的常量变量和数据类型. 常量变量 常量的定义 一块内存中的数据存储空间,里面的数据不可以更改. 变量的定义 一块内存中的数据存储 ...

随机推荐

  1. 对象池模式(Object Pool Pattern)

    本文节选自<设计模式就该这样学> 1 对象池模式的定义 对象池模式(Object Pool Pattern),是创建型设计模式的一种,将对象预先创建并初始化后放入对象池中,对象提供者就能利 ...

  2. vue3 高阶 API 大汇总,强到离谱

    高阶函数是什么呢? 高阶函数英文名叫:Higher Order function ,一个函数可以接收一个或多个函数作为输入,或者输出一个函数,至少满足上述条件之一的函数,叫做高阶函数. 前言 本篇内容 ...

  3. Java培训班4个月有用吗?

    很多想学Java都会经历这样一个选择,是自学还是报班?自学的话需要一步步摸索,从无到有硬啃下来,时间没保证:可如果报班的话,目前市面上五花八门的培训机构又是鱼龙混杂,并且现在越来越多的培训机构宣称&q ...

  4. LGV 引理小记

    讲个笑话,NOI 之前某场模拟赛让我知道了这个神奇的科技,于是准备 NOI 之前学完,结果鸽着鸽着就鸽掉了,考 day1 之前一天本来准备花一天时间学的,然后我就开玩笑般地跟自己说,这么 trivia ...

  5. 学习资源 Docker从入门到实践 pdf ,docker基础总结导图

    学习资源 Docker从入门到实践 pdf ,docker基础总结导图 Docker从入门到实践 pdf 云盘地址:https://pan.baidu.com/s/1vYyxlW8SSFSsMuKaI ...

  6. 问题记录:SNP 标记 phasing

    GATK4 检测的SNP标记,有些位点会在检测过程中完成 phasing,在后续做基因型填充的时候有坑. GATK4 phasing 结果的缺失位点不是 ./. 也不是 .|.  而是直接变成一个单独 ...

  7. 设置administrator账号密码

    设置administrator账号密码: 打开:附件->运行 输入:lusrmgr.msc 在里面的用户里修改administrator密码

  8. 使用GitHub Action进行打包并自动推送至OSS

    GitHub Action 是 GitHub 于 2018 年 10 月推出的一个 CI\CD 服务. 官方文档:https://docs.github.com/cn/actions CI\CD 持续 ...

  9. idea数据库报错java.lang.ClassNotFoundException: com.mysql.jdbc.Driver

    通过idea操作数据库,进行数据的增加,运行时报错java.lang.ClassNotFoundException: com.mysql.jdbc.Driver 原因:没有导入mysql-connec ...

  10. day14 linux三剑客之sed命令

    day14 linux三剑客之sed命令 sed命令 Sed 主要用来自动编辑一个或多个文件.简化对文件的反复操作.编写转换程序等. sed(流式编辑器) : sed主要用来修改文件. 1.sed命令 ...