首页 > 编程语言 >Java8新特性之重复注解和类型注解(五)

Java8新特性之重复注解和类型注解(五)

时间:2023-10-12 18:22:31浏览次数:45  
标签:Roles 标记 重复 class Role 注解 ElementType Java8

1. 重复注解介绍

Java8中引入的一个新注解@Repeatable,该注解只能标记在其他注解上,表示被标记的注解可以重复声明在类、属性、方法等上面;但@Repeatable注解还是得需要定义容器注解配合才能使用,所以也只是增强了代码的可读性;

public class AnnotationTest {

    /**
     * Java8之前写法
     * 使用容器注解
     */
    @Roles({@Role("System"), @Role("Business")})
    private User zs;
}

/**
 * 角色注解
 */
@Documented
@Retention(RetentionPolicy.RUNTIME)
@Target({ElementType.FIELD})
@interface Role {
    String value();
}

/**
 * 角色容器注解
 */
@Documented
@Retention(RetentionPolicy.RUNTIME)
@Target({ElementType.FIELD})
@interface Roles {
    Role[] value();
}

class User {
    private String name;
}

public class AnnotationTest {

    /**
     * Java8的写法
     * 可重复声明注解
     */
    @Role("System")
    @Role("Business")
    private User zs;
}

/**
 * 角色注解
 */
@Documented
@Retention(RetentionPolicy.RUNTIME)
@Target({ElementType.FIELD})
// 使用重复注解, 并指向其容器注解
@Repeatable(Roles.class)
@interface Role {
    String value();
}

/**
 * 角色容器注解
 */
@Documented
@Retention(RetentionPolicy.RUNTIME)
@Target({ElementType.FIELD})
@interface Roles {
    Role[] value();
}

class User {
    private String name;
}

2. 获取重复声明注解的值

public class AnnotationTest {

    @Role("System")
    @Role("Business")
    private User zs;

    public static void main(String[] args) throws Exception {
        Field zs = AnnotationTest.class.getDeclaredField("zs");
        // 通过容器注解去获取重复声明注解的值
        Roles roles = zs.getAnnotation(Roles.class);
        Role[] roleArr = roles.value();
        for (Role role : roleArr) {
            System.out.println(role.value());
        }
    }
}

@Documented
@Retention(RetentionPolicy.RUNTIME)
@Target({ElementType.FIELD})
@Repeatable(Roles.class)
@interface Role {
    String value();
}

@Documented
@Retention(RetentionPolicy.RUNTIME)
@Target({ElementType.FIELD})
@interface Roles {
    Role[] value();
}

class User {
    private String name;
}

// 运行结果
System
Business

3. 类型注解介绍

在自定义一个注解的时候可以使用@Target元注解标记在自定义的注解上面,表示该自定义注解所修饰的对象范围,其@Target元注解的值是一个ElementType枚举类型的数组,在Java8中ElementType枚举新增了TYPE_PARAMETERTYPE_USE两个实例,可配合Checker Framework做编译期检查;其所有元素介绍如下:

  • TYPE:表示注解可标记在类、接口(包括注解类型)、枚举上
  • FIELE:表示注解可标记在成员变量、枚举实例上
  • METHOD:表示注解可标记在方法上
  • PARAMETER:表示注解可标记在参数上
  • CONSTRUCTOR:表示注解可标记在构造方法上
  • LOCAL_VARIABLE:表示注解可标记在局部变量上
  • ANNOTATION_TYPE:表示注解可标记在注解类型上
  • PACKAGE:表示注解可标记在包上
  • TYPE_PARAMETER:表示注解可标记在类型变量声明语句中
  • TYPE_USE:表示注解可标记在类型变量使用语句中

原文链接:https://blog.csdn.net/gu19930914/article/details/115752472

标签:Roles,标记,重复,class,Role,注解,ElementType,Java8
From: https://www.cnblogs.com/hefeng2014/p/17760244.html

相关文章

  • Java8新特性之方法引用(三)
    1.方法引用介绍方法引用其实是lambda表达式的升级写法,采用::固定语法,可以使代码更简洁、紧凑;2.方法引用的5种类型2.1对象引用::实例方法名函数式接口抽象方法的形参列表与实例方法的一致,且方法的返回值类型一致;publicclassMethodReferencesTest{publicstaticvo......
  • Java8新特性之接口的默认方法和静态方法(四)
    1.背景介绍在Java8之前,接口中定义的方法都是抽象方法,即默认都是被publicabstract修饰的;但从Java8开始,允许在接口中定义带有方法体的默认方法和静态方法;publicclassInterfaceTest{publicstaticvoidmain(String[]args){}}interfaceInterfaceA{/*......
  • Java8新特性之函数式接口(二)
    1,函数式接口介绍前言:由于Java8中引入了lambda表达式语法,但该语法需要配合一种特定的接口才能使用,由此产生出了函数式接口;函数式接口指有且仅有一个抽象方法(由Object对象继承的方法不算)(但可以有多个默认方法和静态方法)的接口,当这样的接口在作为方法参数时可以隐式的转换为lambda......
  • Java8新特性之Lambda表达式(一)
    Java8新特性之Lambda表达式(一)文章目录1.lambda表达式介绍2.lambda表达式的重要特征3.lambda表达式对域外变量的限制4.lambda表达式的优缺点5.lambda表达式的使用场景6.lambda表达式的实现原理7.相关链接1.lambda表达式介绍lambda表达式是Java8提供的新特......
  • java 后台防止重复提交(注解方式)
    /***自定义注解防止表单重复提交**@authorframework*/@Inherited@Target(ElementType.METHOD)@Retention(RetentionPolicy.RUNTIME)@Documentedpublic@interfaceRepeatSubmit{/***间隔时间(ms),小于此时间视为重复提交*/intinterval(......
  • awk 依据几列的值删除重复行
    依据几列的值删除重复行输入1.txta11a12ab3ac4ac5ac6ad7ad8ae9af10af11输出2.txtab3ae9先把1.txt按照指定的几列(第1,2列)排序sort-k1,1-k2,21.txt>3.txtawk'{last=$0;chr=$1;start=$2;getline;if(chr==$1&&start==$2){printlas......
  • Java @Override 注解
    在代码中,你可能会看到大量的 @Override这个注解简单来说就是让编译器去读的,能够避免你在写代码的时候犯一些低级的拼写错误。Java @Override@Override用途@Override因为重写(Override)的特性是,参数和返回以及方法名都不能变。如果在写代码的时候,因为方法名不小心敲错了,在没有 @Ov......
  • Java @Override 注解
    在代码中,你可能会看到大量的 @Override 注解。这个注解简单来说就是让编译器去读的,能够避免你在写代码的时候犯一些低级的拼写错误。Java @Override 注解用来指定方法重写(Override),只能修饰方法并且只能用于方法重写,不能修饰其它的元素。@Override 注解可以强制一个子类必......
  • 83、删除链表重复节点
    Givenasortedlinkedlist,deleteallduplicatessuchthateachelementappearonlyonce.Forexample,Given1->1->2,return1->2.Given1->1->2->3->3,return1->2->3 publicListNodedeleteDuplicates(ListNodehead){if(head=......
  • @FeignClien注解
    @FeignClient是SpringCloud中的一个注解,用于定义一个声明式的REST客户端。它可以让我们像调用本地方法一样调用远程服务。@FeignClient注解有以下属性:name:指定FeignClient的名称,用于创建FeignClient的SpringBean,默认值为类名的简单名称。value:同 name,用于指定FeignC......