一文搞懂什么是“注解”

简介: 一文搞懂什么是“注解”

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

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

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

1688127426791.jpg

1、什么是注解

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

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

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

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

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

2、注解的优缺点

注解的优点:

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

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

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

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

注解的缺点:

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

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

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

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

    2、注解的应用场景

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

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

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

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

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

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

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

  11. 文档生成:注解可以用于生成文档,提供额外的说明和描述。例如,使用 @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. 简化编码和提高开发效率:通过使用自定义注解,可以简化编码过程并提高开发效率。注解可以自动化一些常见的任务和操作,减少样板代码的编写,从而加快开发速度。

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

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

目录
相关文章
|
5月前
|
Java 编译器 Spring
一文搞懂:什么是注解?
一文搞懂:什么是注解?
35 0
|
Java 开发者
【面试题精讲】注解的解析方法有哪几种?
【面试题精讲】注解的解析方法有哪几种?
|
6月前
|
Java 编译器 API
【面试问题】注解的实现原理?
【1月更文挑战第27天】【面试问题】注解的实现原理?
|
缓存 Java 索引
一文读懂注解的底层原理
一文读懂注解的底层原理
151 0
|
Java uml Spring
被面试官问烂的Spring AOP原理,你是怎么答的?
Spring AOP在Spring体系中深不可测,Spring AOP原理也是经常在互联网大厂面试时被问到,今天,我给大家抽丝剥茧,详细到你无法想象。我划分为四个阶段给大家介绍:创建代理对象阶段、拦截目标对象阶段、调用代理对象阶段、调用目标对象阶段。
96 0
|
设计模式 缓存 安全
面试官问 Spring AOP 中两种代理模式的区别,我懵逼了
基本介绍 代理模式是一种结构性设计模式。为对象提供一个替身,以控制对这个对象的访问。即通过代理对象访问目标对象,并允许在将请求提交给对象前后进行一些处理。 被代理的对象可以是远程对象、创建开销大的对象或需要安全控制的对象。 代理模式主要有三种不同的形式: 静态代理:由程序员创建代理类或特定工具自动生成源代码再对其编译。在程序运行前代理类的 .class 文件就已经存在了 动态代理(JDK 代理、接口代理):在程序运行时运用反射机制动态创建而成,动态就是在程序运行时生成的,而不是编译时。 cglib 代理(可以在内存动态的创建对象,而不是实现接口,属于动态代理的范畴)
|
XML 缓存 Java
Java注解怎么用
Java注解怎么用
227 0
|
缓存 Java 容器
Spring源码学习:一篇搞懂@Autowire和@Resource注解的区别
最近在刷到很多文章讲解Spring IOC依赖注入时@Autowire和@Resource注解的区别,不同的文章总结出来的点有异同,所以还是看源码自己总结一下其两者的区别,及其用法。
153 0
Spring源码学习:一篇搞懂@Autowire和@Resource注解的区别
|
Java 编译器
注解和反射(一)【注解的基础知识和架构】
注解和反射(一)【注解的基础知识和架构】
131 0
注解和反射(一)【注解的基础知识和架构】