一文搞懂什么是“注解”

举报
激流丶 发表于 2023/07/01 13:08:47 2023/07/01
【摘要】 一文搞懂什么是“注解”

博主介绍: ✌博主从事应用安全和大数据领域,有8年研发经验,5年面试官经验,Java技术专家,阿里云专家博主,华为云云享专家✌

Java知识图谱点击链接:体系化学习Java(Java面试专题)

💕💕 感兴趣的同学可以收藏关注下不然下次找不到哟💕💕

image.png

1、什么是注解

注解是一种在代码中添加元数据的方式。它们提供了一种在源代码中添加补充信息的机制,可以用于描述类、方法、字段等程序元素的特性和行为。注解可以在编译时、运行时或者在开发工具中使用,以提供额外的信息和指示。

注解使用特殊的语法来定义,通常以 @ 符号开头,紧跟着注解的名称和一对括号。括号中可以包含一些参数,用于传递额外的信息给注解。

注解在Java中有广泛的应用,例如:

  • @Override 注解用于标记一个方法是覆盖或实现父类或接口中的方法。
  • @Deprecated 注解用于标记一个方法或类已经过时,不推荐使用。
  • @SuppressWarnings 注解用于抑制编译器的警告信息。
  • @Test 注解用于标记一个测试方法。

除了这些内置的注解,Java还提供了自定义注解的能力,开发人员可以根据自己的需求定义和使用注解。自定义注解可以用于编写更加灵活和可读性强的代码,同时也可以与其他工具和框架进行集成,实现更多的功能和自动化的处理。

2、注解的优缺点

注解的优点:

  1. 提供了一种在代码中添加元数据的方式,可以为程序元素(类、方法、字段等)添加额外的信息和指示,增强了代码的可读性和可维护性。

  2. 注解可以在编译时、运行时或者在开发工具中使用,具有灵活性和可扩展性,可以根据不同的需求和场景进行使用和处理。

  3. 注解可以与其他工具和框架进行集成,实现一些自动化的处理,如自动生成代码、配置文件的解析等。

  4. 注解可以用于编写更加简洁和优雅的代码,减少了一些重复性的工作,提高了开发效率。

注解的缺点:

  1. 注解的使用需要一定的学习和了解,对于初学者来说可能会增加一些学习成本。

  2. 注解的滥用可能会导致代码的可读性下降,过多的注解可能会让代码变得冗长和复杂。

  3. 注解的处理可能会引入一些额外的复杂性和性能开销,特别是在运行时进行注解的处理时。

  4. 注解的使用需要遵循一定的规范和约定,否则可能会导致一些潜在的问题和错误。

2、注解的应用场景

注解在Java中有广泛的应用场景,以下是一些常见的应用场景:

  1. 标记和配置:注解可以用于标记和配置特定的类、方法、字段等程序元素。例如, @Entity 注解可以标记一个类为实体类, @Autowired 注解可以标记一个字段或构造函数为自动装配的依赖项。

  2. 编译时检查:注解可以用于在编译时进行静态检查,以确保代码的正确性。例如, @Override 注解用于标记一个方法是覆盖或实现父类或接口中的方法,编译器会检查该方法是否正确地覆盖了父类或接口中的方法。

  3. 代码生成:注解可以与代码生成工具结合使用,自动生成一些重复性的代码。例如,使用 @Getter 和 @Setter 注解可以自动生成类的getter和setter方法。

  4. 单元测试:注解可以用于标记测试方法,以便测试框架能够自动识别和执行这些方法。例如,JUnit框架使用 @Test 注解标记测试方法。

  5. 配置文件解析:注解可以用于解析配置文件,将配置文件中的信息映射到相应的类和字段上。例如,Spring框架中的 @Value 注解可以将配置文件中的值注入到类的字段中。

  6. AOP(面向切面编程):注解可以用于实现面向切面编程,对特定的方法或类进行横切关注点的处理。例如,使用 @Transactional 注解可以将事务管理逻辑应用于指定的方法或类。

  7. 文档生成:注解可以用于生成文档,提供额外的说明和描述。例如,使用 @Documented 注解可以将注解的信息包含在生成的文档中

4、注解的原理

注解的原理是通过Java的反射机制来实现的。在Java中,反射机制允许程序在运行时动态地获取类的信息,并且可以操作类的字段、方法和构造函数等。

当使用注解时,编译器会将注解的信息保存在编译后的字节码文件中。在程序运行时,通过反射机制可以读取到这些注解,并根据注解的信息来进行相应的处理。

具体地,注解的原理包括以下几个步骤:

  1. 定义注解:使用Java的注解定义语法,定义注解的名称、参数和默认值等信息。
  2. 注解的使用:在程序中使用注解,将注解应用到类、方法、字段等程序元素上,并传递相应的参数值。
  3. 编译器处理:编译器在编译源代码时会扫描注解,并将注解的信息保存到编译后的字节码文件中。
  4. 反射获取注解:在程序运行时,通过反射机制获取类的信息,包括注解的信息。
  5. 处理注解:根据注解的信息,进行相应的处理。这可以是生成额外的代码、执行特定的逻辑或者进行其他操作。

注解的原理使得开发人员可以在代码中添加元数据,并根据这些元数据来进行相应的处理。这种机制使得代码可以更加灵活、可读性更强,并且可以与其他工具和框架进行集成,实现更多的功能和自动化的处理。

5、什么是元注解

元注解是指用于注解其他注解的注解。在Java中,元注解是一种特殊的注解,用于对其他注解进行修饰和控制。元注解可以用于定义自定义注解的行为、作用范围、生命周期等属性。

Java提供了几种元注解,包括:

  1. @Retention:指定注解的生命周期。可选的取值有三种:

    • RetentionPolicy.SOURCE:注解仅在源代码中保留,编译时会被丢弃。
    • RetentionPolicy.CLASS:注解在编译时被保留,但在运行时不可访问。
    • RetentionPolicy.RUNTIME:注解在运行时保留,可以通过反射机制访问。
  2. @Target:指定注解可以应用的目标元素。可选的取值包括:

    • ElementType.TYPE:类、接口、枚举。
    • ElementType.FIELD:字段。
    • ElementType.METHOD:方法。
    • ElementType.PARAMETER:方法参数。
    • ElementType.CONSTRUCTOR:构造函数。
    • ElementType.LOCAL_VARIABLE:局部变量。
    • ElementType.ANNOTATION_TYPE:注解类型。
    • ElementType.PACKAGE:包。
  3. @Documented:指定注解是否包含在Java文档中。

  4. @Inherited:指定注解是否可以被继承。如果一个注解被@Inherited修饰,那么它将被子类继承。

  5. @Repeatable:指定注解是否可重复应用于同一目标元素。该元注解在Java 8中引入。

元注解的作用是为其他注解提供更多的控制和限制。通过使用元注解,开发人员可以定义自己的注解,并指定它们的作用范围、生命周期和其他属性,从而实现更加灵活和可定制的注解功能。

6、如何实现自定义注解

自定义注解的代码如下:

package com.pany.camp.annotations;

import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;

/**
 *
 * @description:  自定义注解
 * @copyright: @Copyright (c) 2022 
 * @company: Aiocloud
 * @author: pany
 * @version: 1.0.0 
 * @createTime: 2023-06-30 20:24
 */
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.METHOD)
public @interface MyAnnotation {
    String value() default "";
    int count() default 0;
}


自定义注解的应用

package com.pany.camp.annotations;

/**
 *
 * @description: 注解的应用
 * @copyright: @Copyright (c) 2022
 * @company: Aiocloud
 * @author: pany
 * @version: 1.0.0
 * @createTime: 2023-06-30 20:24
 */
public class MyClass {

    @MyAnnotation(value = "Hello", count = 5)
    public void myMethod() {
        // 方法体
    }

    public static void main(String[] args) throws NoSuchMethodException {
        MyClass obj = new MyClass();
        Class<?> cls = obj.getClass();
        MyAnnotation annotation = cls.getDeclaredMethod("myMethod").getAnnotation(MyAnnotation.class);
        System.out.println(annotation.value()); // 输出:Hello
        System.out.println(annotation.count()); // 输出:5
    }
}


输出结果如下:

Hello
5

Process finished with exit code 0

7、自定义注解有什么好处

自定义注解有以下几个好处:

  1. 提供额外的元数据:通过自定义注解,可以为代码添加额外的元数据信息。这些信息可以用于描述类、方法、字段等程序元素的特性和行为,提供更多的上下文和指示。

  2. 增加代码可读性和可维护性:通过使用自定义注解,可以使代码更加清晰和易于理解。注解可以提供关于代码意图和用途的信息,使其他开发人员能够更快地理解代码的含义和目的。

  3. 实现编译时检查和验证:自定义注解可以用于实现编译时的检查和验证。通过在注解中定义一些规则和约束,可以在编译阶段对代码进行静态检查,以确保代码的正确性和一致性。

  4. 与其他工具和框架集成:自定义注解可以与其他工具和框架进行集成,以实现更多的功能和自动化的处理。例如,许多框架使用注解来实现依赖注入、持久化、路由等功能。

  5. 简化编码和提高开发效率:通过使用自定义注解,可以简化编码过程并提高开发效率。注解可以自动化一些常见的任务和操作,减少样板代码的编写,从而加快开发速度。

总的来说,自定义注解可以提供更多的元数据和上下文信息,提高代码的可读性、可维护性和可靠性,同时也可以简化开发过程和提高开发效率。

image.png

💕💕 本文由激流原创,原创不易,感谢支持
💕💕喜欢的话记得点赞收藏啊

image.png

【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。