文章目录
- 一、注解概述
- 1.1 什么是注解
- 1.2 注解的用途
- 1.3 注解的常见种类
- 1.4 注解类型和常用注解
- 二、自定义注解
- 2.1 自定义注解的格式
- 2.2 自定义注解中的属性
- 2.3 自定义注解的案例
- 参考资料
一、注解概述
1.1 什么是注解
注解是元数据的一种形式,它提供的数据不是程序本身的一部分。
注解对它们注释的代码的操作没有直接影响。举个简单的例子,系统上有一个 sm.png
文件,这个文件才是我们真正需要的数据本身,而这个文件的属性则可以称之为 sm.png
的元数据,是用来描述 png 文件的创建时间、修改时间、分辨率等信息的,这些信息无论是有还是没有都不影响它作为图片的性质,都可以使用图片软件打开。
注解的生效依赖于它们被解析的方式,常见的解析方法有两种:
- 编译期直接扫描:编译器在编译 Java 代码时会扫描对应的注解并进行相应处理。
- 运行期通过反射处理:许多框架利用反射机制在运行时对注解进行解析和处理。
1.2 注解的用途
注解有多种用途,其中包括:
(1)编译器信息
一些注解会被编译器在编译时处理:
-
错误检测:注解可以帮助编译器在编译时检测代码中的错误。例如,
@Override
注解可以检查方法是否正确地覆盖了父类的方法。 -
警告抑制:通过使用注解(如
@SuppressWarnings
),可以抑制编译器的特定警告。
(2)编译时和部署时处理
工具可以在编译时或部署时处理注解。
-
代码生成:一些框架和工具(如 Lombok)可以在编译时处理注解,根据注解生成额外的代码,如构造函数、
getter
和setter
方法。 -
配置生成:注解可以用于生成配置文件(如XML、JSON)。这些配置文件在部署时可以用于配置应用程序的各种参数。
(3) 运行时处理
注解可以在运行时通过反射机制进行处理。
-
依赖注入:许多依赖注入框架(如 Spring 和 Guice)使用注解(如
@Autowired
)来标记和注入依赖。 -
事务管理:在数据库操作中,注解(如
@Transactional
)声明事务的边界,以自动管理事务的开始和结束。 -
日志记录:使用自定义注解可以在运行时动态地添加日志记录逻辑,减少手动编写日志代码的繁琐。
由于注解的便利性,许多框架和库都提供了相应的注解支持,以简化开发并增强功能。
1.3 注解的常见种类
注解主要分为以下三种类型:
- 元注解: java内置的注解,标明该注解的使用范围、生命周期等。
- 标准注解 :Java提供的基础注解,标明过期的元素/标明是复写父类方法的方法/标明抑制警告。
- 自定义注解: 第三方定义的注解,含义和功能由第三方来定义和实现。
1.4 注解类型和常用注解
注解主要分为以下三种类型:
- 元注解:Java 内置的注解,标明该注解的使用范围、生命周期等。具体细节查看 Annotations - Dev.java
- 标准注解:Java 提供的基础注解,标明过期的元素/标明是复写父类方法的方法/标明抑制警告。
- 自定义注解:第三方定义的注解,含义和功能由第三方来定义和实现。
注解类型 | 描述 |
---|---|
元注解 | |
@Retention | 标明注解的保留策略,定义在什么级别保存注解信息 |
@Target | 标明注解的使用目标(如类、方法、字段等) |
@Documented | 标明注解会包含在 Javadoc 中 |
@Inherited | 标明注解可继承 |
标准注解 | |
@Override | 标明此方法覆盖了父类的方法 |
@Deprecated | 标明此元素已过时,不建议使用 |
@SuppressWarnings | 抑制编译器产生的警告信息 |
自定义注解 | |
@Controller | 用于标明 Spring MVC 控制器类 |
@Autowired | 用于标明 Spring 自动注入字段或方法参数 |
@GetMapping | 用于标明 Spring MVC 控制器的方法 GET 请求映射路径 |
@PostMapping | 用于标明 Spring MVC 控制器的方法 POST 请求映射路径 |
二、自定义注解
2.1 自定义注解的格式
自定义注解可以通过 @interface
关键字来定义。
public @interface AnnotationName {// 定义注解的元素(可以看作注解的属性)ElementType elementName();ElementType2 elementName2() default defaultValue;
}
另外,在自定义注解时,我们可以使用 元注解 标明该注解的使用范围、生命周期等。
注解的本质是接口,注解内部的属性是带默认值的方法
2.2 自定义注解中的属性
在 Java 中,注解(Annotation)是一种元数据,提供了一种安全且可移植的方式来将信息关联到程序元素(如类、方法、变量等)。由于注解本质上是编译器处理的特殊标记,不能像普通类那样直接定义属性。为了模拟属性的效果并允许设置默认值,Java 采用方法的形式来声明和访问注解的属性。
例如,定义一个注解时可以使用 key() default "";
的形式,这样在使用该注解时,可以像操作属性一样为 key
赋值,例如 @MyAnnotation(key = "value")
。这种方法不仅便于编译器解析和处理注解的属性值,还使得代码更加简洁和易于理解。
2.3 自定义注解的案例
(1) 定义注解
@Retention(RetentionPolicy.RUNTIME) // 定义注解的保留策略
@Target(ElementType.METHOD) // 定义注解的目标
public @interface MyAnnotation {// 定义注解的元素(属性)String value(); // 必需元素int number() default 0; // 有默认值的元素String description() default ""; // 有默认值的元素
}
(2)使用注解
public class AnnotationExample {/*** 使用自定义注解*/@MyAnnotation(value = "Test", number = 5, description = "This is a test method")public void testMethod() {// 方法实现}
}
以上示例展示了如何在方法上使用自定义注解,并为注解的属性传递了相应的值。在实际开发中,我们可以根据需要定义不同的自定义注解,并在代码中使用它们来实现特定的逻辑。
(3)通过反射在运行时获取注解信息
public static void main(String[] args) throws NoSuchMethodException {Method method = AnnotationExample.class.getMethod("testMethod");MyAnnotation annotation = method.getAnnotation(MyAnnotation.class);if (annotation != null) {System.out.println("value: " + annotation.value());System.out.println("number: " + annotation.number());System.out.println("description: " + annotation.description());}
}
参考资料
Annotations - Dev.java
Java基础常见面试题总结(下) | JavaGuide
Java注解入门到精通,这一篇就够了_java 注解-CSDN博客