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

发布时间 2023-10-12 18:18:24作者: 苦逼vs猴子

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