Java—JDK8新特性—重复注解

news/2024/5/19 15:28:39 标签: java, Java8新特性, JDK8新特性, 重复注解

目录

重复注解是什么?

常见的重复注解的应用场景

源码(JDK中哪里?)

在实际开发中哪里使用了注解(举例)

使用步骤

案例


重复注解是什么?

        重复注解,一个注解可以在一个类、方法、字段上同时使用多次

        重复注解的主要应用场景是对同一个元素可以多次使用同一个注解。这种情况下,我们可以使用重复注解来简化代码,提高可读性

常见的重复注解的应用场景

        1.参数校验:重复注解可以用于对方法参数进行校验

        例如,可以定义一个 @NotNull 注解来标记非空的参数,并且可以重复使用该注解来标记多个参数

java">public void someMethod(@NotNull String param1, @NotNull String param2) {
    // 方法体
}

        2.权限控制:重复注解可以用于标记访问权限

        例如,可以定义一个 @Role 注解来标记用户角色,并且可以重复使用该注解来为某个方法或类指定多个角色

java">@Role("admin")
@Role("manager")
public void someMethod() {
    // 方法体
}

        3.日志记录:重复注解可以用于标记日志级别

        例如,可以定义一个 @LogLevel 注解来指定日志级别,并且可以重复使用该注解来记录不同级别的日志。

java">@LogLevel(LogLevel.INFO)
@LogLevel(LogLevel.ERROR)
public void someMethod() {
    // 方法体
}


源码(JDK中哪里?)

        Module java.base

        Package java.lang.annotation

        Annotation Interface Repeatable

java">package java.lang.annotation;

/**
 * The annotation interface {@code java.lang.annotation.Repeatable} is
 * used to indicate that the annotation interface whose declaration it
 * (meta-)annotates is <em>repeatable</em>. The value of
 * {@code @Repeatable} indicates the <em>containing annotation
 * interface</em> for the repeatable annotation interface.
 *
 * @since 1.8
 * @jls 9.6.3 Repeatable Annotation Interfaces
 * @jls 9.7.5 Multiple Annotations of the Same Interface
 */
@Documented
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.ANNOTATION_TYPE)
public @interface Repeatable {
    /**
     * Indicates the <em>containing annotation interface</em> for the
     * repeatable annotation interface.
     * @return the containing annotation interface
     */
    Class<? extends Annotation> value();
}
java">package java.lang.annotation;

@Documented      
@Retention(RetentionPolicy.RUNTIME) //这个生命周期都有效
@Target(ElementType.ANNOTATION_TYPE)  // 作用注解之上
public @interface Repeatable {
    /**
     * Indicates the <em>containing annotation interface</em> for the
     * repeatable annotation interface.
     * @return the containing annotation interface
     */
    Class<? extends Annotation> value();
}


在实际开发中哪里使用了注解(举例)

如Spring中可以使用多个扫描组件来扫描多个包的注解

java">/
// Source code recreated from a .class file by IntelliJ IDEA
// (powered by FernFlower decompiler)
//

package org.springframework.context.annotation;

import java.lang.annotation.Documented;
import java.lang.annotation.ElementType;
import java.lang.annotation.Repeatable;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
import org.springframework.beans.factory.support.BeanNameGenerator;
import org.springframework.core.annotation.AliasFor;

@Retention(RetentionPolicy.RUNTIME)
@Target({ElementType.TYPE})
@Documented
@Repeatable(ComponentScans.class)
public @interface ComponentScan {
}


使用步骤

01.定义原始注解

02.定义包装注解

03.使用@Repeatable 注解将原始注解 进行包装

04.使用原始注解


案例

01.定义原始注解@Role

java">@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.METHOD)
public @interface Role {
    String value();
}

02.定义包装注解@Roles

java">@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.METHOD)
public @interface Roles {
    Role[] value();
}

03.使用@Repeatable 注解将@Role 进行包装

@Repeatable(包装注解.class)

java">@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.METHOD)
@Repeatable(Roles.class) // 使用@Repeatable 注解将 @Role 进行包装
public @interface Role {
    String value();
}

04.使用原始注解,创建UserManager类,创建两个方法createUser()和deleteUser()

java">public class UserManager {

    @Role("admin1")
    @Role("admin2")
    @Role("admin3")
    @Role("admin4")
    @Role("admin5")
    @Role("admin6")
    public void createUser(String username,String password) {
        System.out.println("User created:" + username);
    }

    @Role("root1")
    @Role("root2")
    @Role("root3")
    @Role("root4")
    @Role("root5")
    @Role("root6")
    public void deleteUser(String username) {
        System.out.println("User deleted:" + username);
    }
}

05.测试类

java">public class TestDemo {
    public static void main(String[] args) throws Exception{
        UserManager userManager = new UserManager();

        Method createUser = UserManager.class.getMethod("createUser", String.class, String.class);
        Role[] roles = createUser.getAnnotationsByType(Role.class);

        for (Role role : roles) {
            System.out.println("create User Role:" + role.value());
        }
        
        userManager.createUser("Jack","123456");

        Method deleteUser = UserManager.class.getMethod("deleteUser", String.class);
        Role[] DeleteUserRoles = deleteUser.getAnnotationsByType(Role.class);
        for (Role role : DeleteUserRoles) {
            System.out.println("Delete User Role:" + role.value());
        }
        userManager.deleteUser("Jack");
    }
}

输出结果:

java">create User Role:admin1
create User Role:admin2
create User Role:admin3
create User Role:admin4
create User Role:admin5
create User Role:admin6
User created:Jack
Delete User Role:root1
Delete User Role:root2
Delete User Role:root3
Delete User Role:root4
Delete User Role:root5
Delete User Role:root6
User deleted:Jack

http://www.niftyadmin.cn/n/5020055.html

相关文章

运维学习之部署Grafana

sudo nohup wget https://dl.grafana.com/oss/release/grafana-10.1.1.linux-amd64.tar.gz &后台下载压缩包&#xff0c;然后按一下回车键。 ps -aux | grep 15358发现有两条记录&#xff0c;就是还在下载中。 ps -aux | grep 15358发现有一条记录&#xff0c;并且tail …

如何将两台Mac显示器设置为单个屏幕配置

​能够在扩展模式下将两个或多个外部显示器连接到Mac是一种解放的屏幕体验&#xff0c;但当每个显示器仍然像独立显示器一样工作时&#xff0c;会导致沮丧。 在这里&#xff0c;我们向你展示如何通过对系统设置进行一些简单的更改&#xff0c;使两个扩展屏幕看起来像一个屏幕。…

ApiAdmin前期环境搭建

ApiAdmin前期环境搭建 一、php环境搭建 1. 下载phpstudy 基本集成了php需要的所有配置&#xff1a;mysql&#xff0c;redis&#xff0c;Nginx&#xff0c;Apache等&#xff0c;Nginx和Apache只能开启一个。 网址&#xff1a;https://www.xp.cn/ 网站 -> 创建网站 ->…

列表对象复制属性到另一个列表对象 从List<Object>另一个List<Object>

目录 事件起因环境和工具解决办法结束语 事件起因 在写一个市级的项目时&#xff0c;遇到了一个问题&#xff0c;这个项目涉及的数据内容非常大&#xff0c;光是数据库文件的大小就已经达到了12G&#xff0c;数据的规模大致是在百万级的&#xff0c;光是我这次参与处理的数据就…

mssql ,数据库还原BAK命令行方式

如果数据库存在&#xff0c;离线断开 ALTER DATABASE [数据库名] SET OFFLINE WITH ROLLBACK IMMEDIATE --断开其他用户与数据库的连接正式开始还原数据库&#xff1a; USE MASTER --这里注意要使用MASTER&#xff0c;以免出现待还原库被占用的情况 RESTORE DATABASE [数据库名…

微服务·数据一致-seata

微服务数据一致-seata 概述 Seata&#xff08;Simple Extensible Autonomous Transaction Architecture&#xff09;是一个开源的分布式事务解决方案&#xff0c;旨在帮助应用程序分布式事务管理的挑战。Seata提供了一套全面的工具和框架&#xff0c;可用于实现跨多个数据库和…

uniapp之uni-forms表单组件封装的双向数据绑定

前言 在uniapp中, 封装组件的props单向数据流更为严格, 不允许改变子组件的props属性, 所以记录下uniapp下的form表单的组件是如何封装的, 双向数据是如何绑定的. 版本: "dcloudio/uni-ui": "^1.4.27", "vue": "> 2.6.14 < 2.7&quo…

sql server服务无法启动怎么办?如何正常启动?

sql server软件是一款关系型数据库管理系统。具有使用方便可伸缩性好与相关软件集成程度高等优点。并且有些应用软件使用过程中是需要sql server数据库的后台支持的&#xff0c;我们在数据编程操作时经常会使用这款编程软件&#xff0c;在编程时系统有时会提示sql server服务无…