32、学习 Java 中的注解(参照官方教程)

简介: 32、学习 Java 中的注解(参照官方教程)


一、注解概述(Annotation)

(1) 大概是什么

📖 Annotations, a form of metadata(元数据), provide data about a program that is not part of the program itself. Annotations have no direct effect on the operation of the code they annotate.

📝 注解是元数据的一种形式,用于提供与程序相关的数据,但这些数据并不是程序的一部分。注解对它们所注释的代码的操作没有直接影响。


(2) 注解的用处

📖① Annotations can be used by the compiler to detect errors or suppress warnings.

📝 注解可以为编译器使用,用于检测错误或抑制警告

📖② 【Compile-time and deployment-time processing】Software tools can process annotation information to generate code, XML files, and so forth.

📝【运行时和部署的时候】软件工具可以通过处理注解信息生成 Java 代码、生成 XML 文件等等 …

📖③【Runtime processing】Some annotations are available to be examined at runtime.

📝 有些注解可在运行时被检测到

二、注解基础

(1) 注解的基本格式

📖 In its simplest form, an annotation looks like the following:

📝 一个注解最简单的格式如下所示:

@Entity

📖 The at sign character (@) indicates to the compiler that what follows is an annotation. In the following example, the annotation’s name is Override:

📝 @ 符号用于告诉编译器 @ 符号后面的内容是一个注解。在下面的例子中,注解的名字是:Override

class Dog extends Animal {
    @Override
    public void test() {
        super.test();
    }
}

📖 The annotation can include elements, which can be named or unnamed, and there are values for those elements:

📝 注解可以包含元素。元素可以有名字,也可以没有名字。元素如下所示:

@Author(
        name = "庆医",
        date = "2022/5/20"
)
class CommonClass { 
    
}

🌼 上面代码中的 name 和 date 是注解的元素

🌼【庆医】和【2022/5/20】是元素的值

@SuppressWarnings(value = "unused")
class Whatever {
    private String s;
}

🌼 上面代码中的 @ 告诉编译器 @ 符号后面的是注解

🌼 SuppressWarnings 是注解名

🌼 value 是 SuppressWarnings 注解的元素

🌼【unused】是 value 元素的值


📖 If there is just one element named value, then the name can be omitted.

📝 如果注解中只写了一个元素,并且元素的名字是 value,那么元素名可以省略掉(如下所示)

//@SuppressWarnings(value = "unused")
@SuppressWarnings("unused")
class Whatever {
    private String s;
}

📖 If the annotation has no elements, then the parentheses(圆括号) can be omitted.

📝 如果注解中没有元素,那么注解的圆括号可以省略掉(如下所示)

class Dog extends Animal {
    @Override // Override 注解没有元素, 圆括号可以省略
    public void test() {
        super.test();
    }
}

📖 It is also possible to use multiple annotations on the same declaration.

📝 也可以在同一个声明上使用多个注解

class Dog extends Animal {
    @Override
    @SuppressWarnings("unused")
    public void test() {
        int a = 66;
        super.test();
    }
}

📖 The annotation type can be one of the types that are defined in the java.lang or java.lang.annotation packages of the Java SE API. It is also possible to define your own annotation type.

📝 注解类型可能存在于 Java 标准版的 java.lang 包或java.lang.annotation 包中。您也可以定义自己的注解类型。

(2) 注解可以使用在哪儿

📖 Annotations can be applied to declarations: declarations of classes, fields, methods, and other program elements. When used on a declaration, each annotation often appears, by convention, on its own line.

📝 注解可以运用于声明:类声明、字段声明、方法声明和其他程序元素的声明。当多个注解使用在同一个声明的时候,每一个注解独占一行。

三、创建注解类型

📖 Many annotations replace comments in code.

📝 很多注解取代了代码中的注释


📖 The annotation type definition looks similar to an interface definition where the keyword interface is preceded by the at sign (@).

📝 定义注解类型就像定义一个接口一样。只是接口的关键字(interface)前面增加了 @ 符号【@ 符号是注解类型的标志】

📖 Annotation types are a form of interface.【注解类型是接口的一种形式】

📖 The body of the annotation definition contains annotation type element declarations, which look a lot like methods. Note that they can define optional default values.

📝 注解定义的主体中包含注解类型元素的定义,注解类型元素的定义看起有点像方法(定义注解类型元素的时候可以提供可选的默认值)

创建注解类型示例:

/**
 * @author 庆医
 * @describe 创建一个注解类型,
 * 花括号中可定义注解的元素(且元素可以有可选的默认值)
 */
@Documented // 使 DescribeInfo 注解能够在 javadoc 文档中出现
public @interface DescribeInfo {
    /*
        元素的类型是:String
        元素名是:author
     */
    String author(); // 作者
    String date(); // 创建时间
    /*
        元素的类型是:int
        元素名是:currentRevision
        该元素的默认值是:1
     */
    int currentRevision() default 1; // 当前版本
    String lastModifiedDate() default ""; // 最后一次修改的时间
    String lastModifiedBy() default ""; // 最后一次是被誰修改的
    String[] reviewers(); // 审核者(可以写数组)
}

🌼 元素的定义和方法有点像,一种语法而已,记住就好。

使用自定义注解:

@DescribeInfo(
        author = "庆医",
        date = "2022/2/2",
        currentRevision = 3,
        lastModifiedDate = "2022/3/3",
        lastModifiedBy = "庆医儿子",
        reviewers = {"Tom", "Eric"}
)
public class MainTest {
}

📖 To make the information in @DescribeInfo appear in Javadoc-generated documentation, you must annotate the @DescribeInfo definition with the @Documented annotation.

📝 为了能够在 javadoc 文档中显示@DescribeInfo自定义注解的信息,您必须在定义该注解的时候标注@Documented注解。

四、注解介绍

📄 注解(Annotation)也被称为元数据(Metadata),用于解释包、类、方法、属性、构造器、局部变量等数据的信息

📄 和注释一样,注解不影响程序的逻辑。当注解可以被编译或运行(相当于嵌入在代码中的补充信息)

📄 在 JavaSE 中,注解的作用非常简单(例如:标记过时的功能、忽略警告等)

📄 在 JavaEE 中,注解非常非常得重要。在 JavaEE 中,注解占据重要地位(可用于配置应用程序的任何切面,代替 Java EE 旧版中所遗留的繁冗代码和 XML 配置等)

📄 软件工具可以通过处理注解信息生成 Java 代码、生成 XML 文件

五、jdk 中的常见注解

jdk 中的预定义注解(jdk 中自带的注解)详细介绍

📄 使用注解必须要加上 @ 符号,它是注解的标志

📗 @Override:只能应用于方法,表示该方法是重写父类的方法

📗 @Deprecated:用于表示某个程序元素(类或方法)已过时

📗 @SuppressWarnings:抑制编译器的警告

📗 @FunctionalInterface:标志该接口是函数式接口(若接口使用了 @FunctionalInterface 注解,并且该接口中存在多个抽象方法:会报错)

@FunctionalInterface
public interface IRocket {
    void test(); 
}

🌼 函数式接口(Functional Interface):只有一个抽象方法的接口

Lambda 表达式、函数式接口

六、四种元注解

📄 元注解:用于修饰注解的注解

📄① Retention:指定注解的作用范围(SOURCE、CLASS、RUNTIME)

📄② Target:指定注解可以在哪些地方使用

📄③ Documented:指定被该注解修饰的自定义注解是否会白 javadoc 文档中显示

📄④ Inherited:指定子类是否可以继承父类的注解

(1) Retention

@Documented
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.TYPE)
public @interface FunctionalInterface {
}

📗 SOURCE:编译器使用该注解后,直接丢弃被该注解修饰的注解

📗 CLASS:编译器会把被该注解修饰的注解记录到字节码文件中(在 JVM 中运行字节码的时候,该注解不会被保留)

📗 RUNTIME:编译器会把被该注解修饰的注解记录到字节码文件中(在 JVM 中运行字节码的时候,该注解会被保留,程序可通过反射获取该注解)

(2) Target

@Target(ElementType.METHOD)
@Retention(RetentionPolicy.SOURCE)
public @interface Override {
}

指定注解可以在哪些地方使用(方法、类型...)

📗 该注解有一个 value 元素(它是数组类型)

📗 value 元素的取值有十种:

🌼 TYPE:可运用在类型上

🌼 FIELD:可运用在属性上

🌼 METHOD:可运用在方法上

🌼 PARAMETER:可运用在参数上

🌼 CONSTRUCTOR:可运用在构造器上

🌼 LOCAL_VARIABLE:可运用在局部变量上

🌼 ANNOTATION_TYPE:可运用在注解类型上

🌼 PACKAGE:可运用在包上

🌼 TYPE_PARAMETER

🌼 TYPE_USE

结束,如有错误,请不吝赐教!

相关文章
|
1月前
|
JavaScript NoSQL Java
接替此文【下篇-服务端+后台管理】优雅草蜻蜓z系统JAVA版暗影版为例-【蜻蜓z系列通用】-2025年全新项目整合搭建方式-这是独立吃透代码以后首次改变-独立PC版本vue版搭建教程-优雅草卓伊凡
接替此文【下篇-服务端+后台管理】优雅草蜻蜓z系统JAVA版暗影版为例-【蜻蜓z系列通用】-2025年全新项目整合搭建方式-这是独立吃透代码以后首次改变-独立PC版本vue版搭建教程-优雅草卓伊凡
184 96
接替此文【下篇-服务端+后台管理】优雅草蜻蜓z系统JAVA版暗影版为例-【蜻蜓z系列通用】-2025年全新项目整合搭建方式-这是独立吃透代码以后首次改变-独立PC版本vue版搭建教程-优雅草卓伊凡
|
7天前
|
Java 编译器 开发者
注解的艺术:Java编程的高级定制
注解是Java编程中的高级特性,通过内置注解、自定义注解及注解处理器,可以实现代码的高度定制和扩展。通过理解和掌握注解的使用方法,开发者可以提高代码的可读性、可维护性和开发效率。在实际应用中,注解广泛用于框架开发、代码生成和配置管理等方面,展示了其强大的功能和灵活性。
60 25
|
2月前
|
消息中间件 Java 数据库
自研Java框架 Sunrays-Framework使用教程「博客之星」
### Sunrays-Framework:助力高效开发的Java微服务框架 **Sunrays-Framework** 是一款基于 Spring Boot 构建的高效微服务开发框架,深度融合了 Spring Cloud 生态中的核心技术组件。它旨在简化数据访问、缓存管理、消息队列、文件存储等常见开发任务,帮助开发者快速构建高质量的企业级应用。 #### 核心功能 - **MyBatis-Plus**:简化数据访问层开发,提供强大的 CRUD 操作和分页功能。 - **Redis**:实现高性能缓存和分布式锁,提升系统响应速度。 - **RabbitMQ**:可靠的消息队列支持,适用于异步
自研Java框架 Sunrays-Framework使用教程「博客之星」
|
2月前
|
Java 调度 开发者
Java线程池ExecutorService学习和使用
通过学习和使用Java中的 `ExecutorService`,可以显著提升并发编程的效率和代码的可维护性。合理配置线程池参数,结合实际应用场景,可以实现高效、可靠的并发处理。希望本文提供的示例和思路能够帮助开发者深入理解并应用 `ExecutorService`,实现更高效的并发程序。
42 10
|
2月前
|
Java 数据库连接 数据库
【潜意识Java】深度分析黑马项目《苍穹外卖》在Java学习中的重要性
《苍穹外卖》项目对Java学习至关重要。它涵盖了用户管理、商品查询、订单处理等模块,涉及Spring Boot、MyBatis、Redis等技术栈。
162 4
|
2月前
|
前端开发 Java 数据库连接
【潜意识Java】深度解读JavaWeb开发在Java学习中的重要性
深度解读JavaWeb开发在Java学习中的重要性
41 4
|
2月前
|
存储 移动开发 算法
【潜意识Java】Java基础教程:从零开始的学习之旅
本文介绍了 Java 编程语言的基础知识,涵盖从简介、程序结构到面向对象编程的核心概念。首先,Java 是一种高级、跨平台的面向对象语言,支持“一次编写,到处运行”。接着,文章详细讲解了 Java 程序的基本结构,包括包声明、导入语句、类声明和 main 方法。随后,深入探讨了基础语法,如数据类型、变量、控制结构、方法和数组。此外,还介绍了面向对象编程的关键概念,例如类与对象、继承和多态。最后,针对常见的编程错误提供了调试技巧,并总结了学习 Java 的重要性和方法。适合初学者逐步掌握 Java 编程。
58 1
|
10月前
|
存储 安全 Java
24、使用 Java 官方教程学习:① 类变量和类方法详解;② 深入介绍 main() 方法
24、使用 Java 官方教程学习:① 类变量和类方法详解;② 深入介绍 main() 方法
117 1
|
10月前
|
存储 Java
【JAVA学习之路 | 进阶篇】Map接口及其实现类及常用方法
【JAVA学习之路 | 进阶篇】Map接口及其实现类及常用方法
|
10月前
|
Java 测试技术 C++
【JAVA学习之路 | 进阶篇】File类及常用方法
【JAVA学习之路 | 进阶篇】File类及常用方法

热门文章

最新文章