程序员scholar 程序员scholar
首页
  • Java 基础

    • JavaSE
    • JavaIO
    • JavaAPI速查
  • Java 高级

    • JUC
    • JVM
    • Java新特性
    • 设计模式
  • Web 开发

    • Servlet
    • Java网络编程
  • Web 标准

    • HTML
    • CSS
    • JavaScript
  • 前端框架

    • Vue2
    • Vue3
    • Vue3 + TS
    • 微信小程序
    • uni-app
  • 工具与库

    • jQuery
    • Ajax
    • Axios
    • Webpack
    • Vuex
    • WebSocket
    • 第三方登录
  • 后端与语言扩展

    • ES6
    • Typescript
    • node.js
  • Element-UI
  • Apache ECharts
  • 数据结构
  • HTTP协议
  • HTTPS协议
  • 计算机网络
  • Linux常用命令
  • Windows常用命令
  • SQL数据库

    • MySQL
    • MySQL速查
  • NoSQL数据库

    • Redis
    • ElasticSearch
  • 数据库

    • MyBatis
    • MyBatis-Plus
  • 消息中间件

    • RabbitMQ
  • 服务器

    • Nginx
  • Spring框架

    • Spring6
    • SpringMVC
    • SpringBoot
    • SpringSecurity
  • SpringCould微服务

    • SpringCloud基础
    • 微服务之DDD架构思想
  • 日常必备

    • 开发常用工具包
    • Hutoll工具包
    • IDEA常用配置
    • 开发笔记
    • 日常记录
    • 项目部署
    • 网站导航
    • 产品学习
    • 英语学习
  • 代码管理

    • Maven
    • Git教程
    • Git小乌龟教程
  • 运维工具

    • Docker
    • Jenkins
    • Kubernetes
  • 算法笔记

    • 算法思想
    • 刷题笔记
  • 面试问题常见

    • 十大经典排序算法
    • 面试常见问题集锦
关于
GitHub (opens new window)
首页
  • Java 基础

    • JavaSE
    • JavaIO
    • JavaAPI速查
  • Java 高级

    • JUC
    • JVM
    • Java新特性
    • 设计模式
  • Web 开发

    • Servlet
    • Java网络编程
  • Web 标准

    • HTML
    • CSS
    • JavaScript
  • 前端框架

    • Vue2
    • Vue3
    • Vue3 + TS
    • 微信小程序
    • uni-app
  • 工具与库

    • jQuery
    • Ajax
    • Axios
    • Webpack
    • Vuex
    • WebSocket
    • 第三方登录
  • 后端与语言扩展

    • ES6
    • Typescript
    • node.js
  • Element-UI
  • Apache ECharts
  • 数据结构
  • HTTP协议
  • HTTPS协议
  • 计算机网络
  • Linux常用命令
  • Windows常用命令
  • SQL数据库

    • MySQL
    • MySQL速查
  • NoSQL数据库

    • Redis
    • ElasticSearch
  • 数据库

    • MyBatis
    • MyBatis-Plus
  • 消息中间件

    • RabbitMQ
  • 服务器

    • Nginx
  • Spring框架

    • Spring6
    • SpringMVC
    • SpringBoot
    • SpringSecurity
  • SpringCould微服务

    • SpringCloud基础
    • 微服务之DDD架构思想
  • 日常必备

    • 开发常用工具包
    • Hutoll工具包
    • IDEA常用配置
    • 开发笔记
    • 日常记录
    • 项目部署
    • 网站导航
    • 产品学习
    • 英语学习
  • 代码管理

    • Maven
    • Git教程
    • Git小乌龟教程
  • 运维工具

    • Docker
    • Jenkins
    • Kubernetes
  • 算法笔记

    • 算法思想
    • 刷题笔记
  • 面试问题常见

    • 十大经典排序算法
    • 面试常见问题集锦
关于
GitHub (opens new window)
npm

(进入注册为作者充电)

  • Java8新特性

    • Java8新特性简介
    • Lambda 表达式
    • 函数式接口
    • 方法的引用
    • 构造器和数组的引用
    • Stream 流式编程
    • 并行流与串行流
    • Optional 类的使用
    • 对反射的支持增强
    • 接口中的默认方法与静态方法
    • 新时间日期API
    • Try-with-Resources 升级
    • 重复注解与类型注解
      • 1. 可重复的注解
      • 2. 类型注解
  • Java9新特性

  • Java10新特性

  • Java11新特性

  • Java12新特性

  • Java13新特性

  • Java14新特性

  • Java15新特性

  • Java新特性
  • Java8新特性
scholar
2024-08-24
目录

重复注解与类型注解

# 重复注解与类型注解详解

前言

在 Java 8 之前,注解的使用有一些局限性,比如:一个元素上只能应用一次注解,不支持在类型上直接应用注解。Java 8 针对这些问题进行了改进,引入了可重复的注解和类型注解,从而增强了注解的灵活性和可用性。

  • 1. 可重复的注解
  • 2. 类型注解

# 1. 可重复的注解

背景:
在 Java 8 之前,一个元素上同一个注解只能使用一次,这限制了开发者的灵活性。Java 8 引入了可重复注解的概念,允许在同一个元素上重复使用同一个注解。

实现方式:
实现可重复注解需要两个步骤:

  1. 创建一个容器注解,用于存放多个重复的注解。
  2. 在可重复的注解上使用 @Repeatable 指定容器注解。

代码示例:

  1. 创建容器注解:
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
import java.lang.annotation.ElementType;

// 定义一个容器注解,用于存放多个 MyAnnotation
@Target({ElementType.TYPE, ElementType.FIELD, ElementType.METHOD, ElementType.PARAMETER, ElementType.CONSTRUCTOR, ElementType.LOCAL_VARIABLE})
@Retention(RetentionPolicy.RUNTIME)
public @interface MyAnnotations {
    MyAnnotation[] value(); // 数组形式存放多个 MyAnnotation
}
1
2
3
4
5
6
7
8
9
10
11
  1. 创建可重复的注解:
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
import java.lang.annotation.ElementType;
import java.lang.annotation.Repeatable;

// 定义可重复的注解,并使用 @Repeatable 指定其容器注解
@Repeatable(MyAnnotations.class)
@Target({ElementType.TYPE, ElementType.FIELD, ElementType.METHOD, ElementType.PARAMETER, ElementType.CONSTRUCTOR, ElementType.LOCAL_VARIABLE})
@Retention(RetentionPolicy.RUNTIME)
public @interface MyAnnotation {
    String value(); // 注解的属性
}
1
2
3
4
5
6
7
8
9
10
11
12
13
  1. 测试使用可重复注解:
public class TestAnnotations {

    // 在方法上使用两个 MyAnnotation 注解
    @MyAnnotation("Hello")
    @MyAnnotation("World")
    public void show() {
    }

    public static void main(String[] args) {
        // 反射获取方法上的注解
        MyAnnotation[] annotations = TestAnnotations.class.getMethod("show").getAnnotationsByType(MyAnnotation.class);
        for (MyAnnotation annotation : annotations) {
            System.out.println(annotation.value()); // 输出:Hello 和 World
        }
    }
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16

开发场景:
可重复注解在实际开发中非常适用于需要标记多个相同类型信息的场景。例如,定义多个相似的安全权限控制注解、API 的版本信息等。

# 2. 类型注解

背景:
在 Java 8 之前,注解只能应用在声明的上下文中,如类、方法、字段、参数等。而 Java 8 扩展了注解的使用场景,允许注解用于任何类型的位置,包括泛型、强制类型转换、实现接口、抛出异常等。

实现方式:
类型注解可以应用在类型参数、局部变量、方法返回值等位置,不需要额外的配置。

代码示例:

public class TestTypeAnnotations {

    // 使用类型注解在泛型类型上
    private List<@MyAnnotation("NonNull") String> list = new ArrayList<>();

    // 使用类型注解在强制类型转换上
    public void castExample(Object obj) {
        String str = (@MyAnnotation("NonNull") String) obj;
        System.out.println(str);
    }

    // 使用类型注解在方法参数上
    public void show(@MyAnnotation("NotNull") String str) {
        System.out.println(str);
    }

    public static void main(String[] args) {
        TestTypeAnnotations test = new TestTypeAnnotations();
        test.castExample("Hello, Type Annotations!");
        test.show("Hello, Parameter Annotations!");
    }
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22

开发场景:
类型注解在实际开发中可以用于更严格的类型检查和代码分析。例如,在泛型类型上使用注解表示类型的非空约束,在类型转换时提供额外的校验信息,甚至在工具中可以结合这些类型注解进行编译期或运行期的检查。

总结

Java 8 通过引入可重复注解和类型注解,极大地扩展了注解的应用场景和灵活性。可重复注解简化了多次使用同类注解的场景,而类型注解则为类型的描述和检查提供了更多的可能性。

编辑此页 (opens new window)
上次更新: 2024/12/28, 18:32:08
Try-with-Resources 升级
Java9 - 新特性

← Try-with-Resources 升级 Java9 - 新特性→

Theme by Vdoing | Copyright © 2019-2025 程序员scholar
  • 跟随系统
  • 浅色模式
  • 深色模式
  • 阅读模式