`
QING____
  • 浏览: 2251346 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

JAVA中@Repeatable注解

    博客分类:
  • JAVA
 
阅读更多

    @Repeatable注解以及其相关特性,是在JDK 8中提供的,简单而言,我们可以设计一种风格的annotation,可以被多次修饰在符合要求的@Target上,在此前一个类型的注释是不能重复修饰在相同地方。被重复修饰的注解,表示此Target同时具有注解的驱动能力,比如下文的@Scheduled,表示此任务方法分别在各自的时机执行。

 

    对于JAVA开发人员,我们常见的、已经基于@Repeatable的注解,比如:

    1、@ComponentScan --- Spring

    2、@Scheduled --- Spring

 

    以Spring @Scheduled为例,我们简述一下其使用场景:

 

    1、@Scheduled元注解

@Target({ElementType.METHOD, ElementType.ANNOTATION_TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Repeatable(Schedules.class)
public @interface Scheduled {

    //cron表达式
    String value();
}

 

    元注解与普通注解没有太大区别,比如target、集成关系等。唯一需要注意的时,需要使用@Repeatable表示其可以被重复修饰目标上,其中还要指定其容器注解类类型---@Schedules。由此可见,元注解和容器注解,需要互相关联。

 

    2、@Schedules容器注解类

@Target({ElementType.METHOD, ElementType.ANNOTATION_TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface Schedules {

    Scheduled[] value();
}

 

    1)容器注解类的@Target设计上需要考虑周全,它是否可以像元注解一样单独使用;以上述为例,表明@Schedules也可以被直接使用。

    2)容器类,应该像例子所示,其value方法(默认方法)需要返回其元注解的列表,否则这个容器类设计将不符合规范。

 

    3、解析注解,我们分别使用java反射和spring辅助类实现:

public class TaskRunner {

    @Scheduled("0 0/15 * * * ?")
    @Scheduled("0 0 12 * ?")
    public void task1() {}

    @Schedules({@Scheduled("0 0/15 * * * ?"),
            @Scheduled("0 0 12 * ?")})
    public void task2() {}


    public static void main(String[] args) throws Exception{
        javaStyle();
        System.out.println("-----------");
        springStyle();
    }


    private static void javaStyle() throws Exception{
        Method[] methods = TaskRunner.class.getMethods();
        for (Method method : methods) {
            Schedules schedules = method.getAnnotation(Schedules.class);
            if (schedules == null) {
                continue;
            }
            Scheduled[] values = schedules.value();
            if (values == null) {
                continue;
            }
            for (Scheduled scheduled : values) {
                System.out.println(scheduled.value());
            }
        }
    }

    private static void springStyle() throws Exception {
        Method[] methods = TaskRunner.class.getMethods();
        for (Method method : methods) {
            Set<Scheduled> schedules = AnnotatedElementUtils.getMergedRepeatableAnnotations(
                    method, Scheduled.class, Schedules.class);
            if (schedules == null) {
                continue;
            }
            for (Scheduled scheduled : schedules) {
                System.out.println(scheduled.value());
            }
        }
    }
}

 

    根据规范,@Scheduled元注解,不能与@Schedules容器注解同时修饰在同一个Target,否则会编译错误。

 

分享到:
评论

相关推荐

    java 元注解 用于定义其它的注解

    @Repeatable 注解是 Java 中的一种元注解,用于指定注解可以被重复应用。@Repeatable 注解类型是从 JDK 8 引入的,用于支持注解的重复应用。 Java 元注解是 Java 语言中的一种重要机制,用于定义和描述其他注解的...

    Java 基础(5-8) - 注解机制详解.pdf

    @Repeatable注解用于标明某个注解可以重复使用,@Native注解用于标明某个注解是native的。 注解是否支持继承?注解可以继承,通过使用元注解@Inherited可以使注解可继承。 注解的实现原理是什么?注解的实现原理是...

    Java元注解.docx

    @Repeatable注解允许一个注解在同一位置重复出现,解决了Java 5和6中注解不能多次使用的限制。通过定义一个容器注解,可以包含多个相同类型的注解实例。 6. **@Native**(Java 8新增): @Native元注解用于指示...

    Java注解@Transactional事务类内调用不生效问题及解决办法

    Java注解@Transactional是Java中的一种注解,主要用于标记事务边界。然而,在某些情况下,@Transactional注解可能不会生效,例如在同一个类中的方法调用时。这是因为Spring的AOP代理机制的限制所致。 在Spring框架...

    Spring java注解,元注解和自定义注解

    在深入了解Spring框架中的注解应用之前,我们首先需要对Java注解有一个基本的认识。Java注解(Annotation)是一种元数据,可以为程序代码添加额外的信息。注解本身并不改变程序的行为,但它可以通过工具或编译器被...

    对spring做java注解扩展

    本文将深入探讨如何在Spring框架中利用Java注解进行扩展,以提升代码的可读性和可维护性。 首先,我们需要了解Java注解(Annotation)。注解是Java语言的一种元数据,它提供了在编译时或运行时对代码进行信息附加的...

    Java8新增的重复注解功能示例

    Java8中新增的重复注解功能允许在同一个程序元素前使用多个相同类型的Annotation,这样可以使得代码更加简洁和灵活。在Java8以前,同一个程序元素前最多只能使用一个相同类型的Annotation,如果需要在同一个元素前...

    Java Annotation手册

    元注解是用于注解其他注解的注解,Java预定义了五种元注解:@Retention、@Target、@Documented、@Inherited 和 @Repeatable。 3.2 @Retention @Retention 定义了注解的保留策略,可以是SOURCE(源码级别,编译后...

    java元注解简单实现.zip

    在Java中,有五个内置的元注解,它们分别是`@Retention`、`@Target`、`@Documented`、`@Inherited`和`@Repeatable`。 1. `@Retention`:这个元注解定义了注解的保留策略,即注解在程序的哪个阶段可见。它有三个可选...

    入门级java 注解学习示例代码

    注解在Java中主要用来简化配置、提供编译时和运行时的元信息、实现自动化的处理任务等。 **注解的类型** 1. **源码级注解(Source-level Annotations)**:这些注解在编译期间由编译器处理,例如`@Override`用于...

    5分钟搞懂java注解@Annotation的具体使用

    Java 5 中引入了注解机制,自此以来,注解在 Java 中扮演着越来越重要的角色,特别是在 Spring 框架中大量使用。 一、注解的定义方式 注解的定义方式与接口定义类似,但多了 @ 字符。例如,Spring 中的 @Service ...

    【java元注解】相关资源

    在Java中,有五种内置的元注解,它们分别是`@Target`、`@Retention`、`@Documented`、`@Inherited`以及`@Repeatable`。这里我们主要讨论前四种,因为`@Repeatable`是在Java 8中引入的,用于表示一个注解可以重复应用...

    关于java注解比较详细的例子

    常见的元注解还包括`@Documented`(将注解包含在Javadoc中)、`@Inherited`(子类继承父类的注解)和`@Repeatable`(允许同一位置重复应用注解)。 5. **处理注解** 注解处理器是Java编译器的一部分,它们在编译...

    5-java进阶-枚举与注解1

    注解是 Java 语言中的一种元数据,用于提供某些信息给编译器或 runtime 环境。注解可以用来生成文档、格式检查、跟踪代码依赖性等。 注解的定义 在 Java 中,注解是使用 @interface 关键字定义的。例如: ```java ...

    全面解析java注解PPT学习教案.pptx

    Java注解是Java编程语言中的一个重要特性,它们提供了一种元数据的方式,使得开发者可以在代码中添加额外的信息,这些信息可以被编译器或者运行时环境用来执行特定的任务。注解在Java中扮演了多种角色,包括代码的...

    Java中自定义注解介绍与使用场景详解

    在 Java 7 及其后的版本中,添加了三个新的注解,分别是 @SafeVarargs、@FunctionalInterface 和 @Repeatable。这些注解可以提供更多的功能和灵活性,帮助开发者更好地使用 Java 语言。 Java 中的自定义注解可以...

    最全Java注解图文超详解(建议收藏).pdf

    Java注解是Java编程语言中的一个重要特性,它允许程序员在代码中添加元数据,这些元数据可以被编译器、解释器或其他工具在编译时或运行时解析和使用。注解的主要目的是提供一种更安全、更方便的方式来为代码添加信息...

    Java注解

    例如,`@Retention`注解定义了注解的生命周期,`@Target`指定了注解可以应用到的程序元素类型,`@Documented`指示编译器将注解包含在文档中,`@Inherited`让子类继承父类的注解,以及`@Repeatable`允许在同一位置...

    Java8新特性之重复注解(repeating annotations)浅析

    而在Java 8中,我们可以直接使用`@Repeatable`注解来定义可以重复使用的注解,如: ```java @Repeatable(Authorities.class) public @interface Authority { String role(); } public @interface Authorities { ...

    Java之注解

    Java之注解是一种元数据,它提供了在代码中附加信息的方式,这些信息可以被编译器、IDE(集成开发环境)或运行时的Java虚拟机(JVM)用来执行特定的任务。注解在Java中扮演着重要的角色,帮助开发者简化代码、增强可...

Global site tag (gtag.js) - Google Analytics