Java 注解 (Annotations)的定义和使用规则

Java语言的注解(Annotations) 注解(Annotations)是Java 5引入的一种语法结构,它为程序元素(类、方法、变量等)提供元数据。注解本身不会直接影响代码的逻辑,但可以通过框架、工具等进行处理,从而达到特定的目的。注解使用“@”符号标识,后面跟随注解名和可选参数。自定义注解的创建与接口类似,我们可以定义注解的成员。```java@Target(ElementType.METHOD) // 指定注解可以用在方法上@Retention(RetentionPolicy.RUNTIME) // 指定注解在运行时仍然可用。 阅读详情

Java 注解(Annotations)是 Java 5 引入的一种元数据(Metadata),它提供了一种在源代码中嵌入补充信息的方式,这些信息可以被编译器、JVM 或其他工具在编译时、运行时进行处理。 注解本身不会直接影响程序的执行,但可以用来指导编译器、JVM 或其他工具的行为,从而实现各种功能。

一、 注解的定义 (Annotation Definition)

  1. 什么是元数据 (Metadata)?

    • 元数据是描述数据的数据。 在 Java 中,元数据是指描述程序代码的数据,例如类、方法、字段等的属性信息。
    • 注解就是一种元数据,它可以用来描述类、方法、字段、参数、局部变量等程序元素。
  2. 注解的语法:

    @Retention(RetentionPolicy.RUNTIME) // 元注解,指定注解的保留策略
    @Target({ElementType.METHOD, ElementType.TYPE}) // 元注解,指定注解可以应用的程序元素类型
    public @interface MyAnnotation { // 定义一个注解
    
        // 注解成员 (Annotation Members)
        String name() default "Default Name"; // 默认值
        int value(); // 必须赋值
    
        Class<?> type() default void.class; //类型
    }
    
    • @interface 关键字: 用于定义一个注解。
    • 注解名 (Annotation Name): 遵循 PascalCase 命名规范(每个单词首字母大写),例如 Override, Deprecated, WebServlet。
    • 注解成员 (Annotation Members):
      • 类似于接口中的方法声明,但没有方法体。
      • 可以有默认值 (使用 default 关键字指定)。
      • 如果没有默认值,则在使用注解时必须显式赋值。
      • 成员的类型可以是原始类型、String、Class、枚举类型、注解类型或这些类型的数组。
      • 注解成员实际上类似于接口中的方法,这意味着它们可以有访问修饰符,但通常省略 (默认是 public)。
      • 注解成员后面要跟一对小括号,即使没有参数。

二、元注解 (Meta-Annotations)

元注解是用于修饰注解的注解,用于指定注解的特性。

  1. @Retention:

    • 作用: 指定注解的保留策略 (Retention Policy),即注解在哪个阶段可用。

    • RetentionPolicy 枚举:

      • RetentionPolicy.SOURCE: 注解仅保留在源代码中,在编译时被丢弃。 例如,@Override 注解。
      • RetentionPolicy.CLASS: 注解保留在 class 文件中,但在运行时会被 JVM 丢弃。
      • RetentionPolicy.RUNTIME: 注解保留在 class 文件中,并且在运行时可以通过反射 API 获取。 这是最常用的保留策略,可以实现各种动态功能。
    • 示例:

      @Retention(RetentionPolicy.RUNTIME) // 指定注解在运行时可用
      public @interface MyAnnotation {
          // ...
      }
      
  2. @Target:

    • 作用: 指定注解可以应用的程序元素类型 (Target Element)。

    • ElementType 枚举:

      • ElementType.TYPE: 可以应用于类、接口、枚举、注解。
      • ElementType.FIELD: 可以应用于字段。
      • ElementType.METHOD: 可以应用于方法。
      • ElementType.PARAMETER: 可以应用于方法参数。
      • ElementType.CONSTRUCTOR: 可以应用于构造方法。
      • ElementType.LOCAL_VARIABLE: 可以应用于局部变量。
      • ElementType.ANNOTATION_TYPE: 可以应用于注解。
      • ElementType.PACKAGE: 可以应用于包。
      • ElementType.TYPE_PARAMETER: 类型参数,since 1.8
      • ElementType.TYPE_USE: 使用类型的任何地方, since 1.8
    • 示例:

      @Target({ElementType.METHOD, ElementType.TYPE}) // 指定注解可以应用于方法和类
      public @interface MyAnnotation {
          // ...
      }
      
  3. @Documented:

    • 作用: 指定该注解应该包含在 Javadoc 文档中。

    • 示例:

      @Documented // 指定该注解应该包含在 Javadoc 文档中
      public @interface MyAnnotation {
          // ...
      }
      
  4. @Inherited:

    • 作用: 指定该注解可以被子类继承。

    • 示例:

      @Inherited // 指定该注解可以被子类继承
      public @interface MyAnnotation {
          // ...
      }
      
  5. @Repeatable (Java 8+):

    • 作用: 指定该注解可以在同一个程序元素上重复使用。
    • 示例:
      @Repeatable(Authorities.class)
      public @interface Authority {
          String role();
      }
      
      public @interface Authorities {
          Authority[] value();
      }
      
      @Authority(role="Admin")
      @Authority(role="Editor")
      public class MyClass {
          // ...
      }
      

三、内置注解 (Built-in Annotations)

Java 提供了一些内置注解,可以直接使用:

  1. @Override:

    • 作用: 用于标记一个方法是重写 (Override) 了父类的方法。

    • 用途:

      • 帮助编译器检查是否正确地重写了方法。 如果方法签名与父类方法不匹配,编译器会报错。
      • 提高代码可读性,明确表明该方法是重写了父类的方法。
    • 示例:

      class Animal {
          void eat() {
              System.out.println("Animal is eating.");
          }
      }
      
      class Dog extends Animal {
          @Override // 标记该方法重写了父类的 eat() 方法
          void eat() {
              System.out.println("Dog is eating.");
          }
      }
      
  2. @Deprecated:

    • 作用: 用于标记一个类、方法或字段已过时 (Deprecated),不建议使用。

    • 用途:

      • 提醒开发者该类、方法或字段已经不推荐使用,可能会在将来的版本中被移除。
      • 可以提供替代方案的说明。
    • 示例:

      @Deprecated // 标记该方法已过时
      public void oldMethod() {
          // ...
      }
      
      /**
       * @deprecated Use {@link #newMethod()} instead.
       */
      @Deprecated
      public void oldMethodWithComment(){
          //...
      }
      
      public void newMethod() {
          // ...
      }
      
  3. @SuppressWarnings:

    • 作用: 用于抑制编译器发出的警告。

    • 用途:

      • 在某些情况下,编译器可能会发出一些不必要的警告,可以使用 @SuppressWarnings 注解来抑制这些警告。
    • 取值:

      • all: 抑制所有警告。
      • boxing: 抑制与自动装箱/拆箱相关的警告。
      • deprecation: 抑制与使用了 @Deprecated 标记的类、方法或字段相关的警告。
      • unchecked: 抑制与未检查的类型转换相关的警告(例如,在使用原始类型时)。
      • unused: 抑制与未使用的变量相关的警告。
      • resource: 抑制与资源未关闭相关的警告。
      • 等等 (具体取决于编译器)。
    • 示例:

      @SuppressWarnings("unchecked") // 抑制类型转换警告
      List list = new ArrayList();
      list.add("Hello");
      String s = (String) list.get(0); // 编译器会发出 unchecked 类型转换警告
      

四、自定义注解 (Custom Annotations)

除了内置注解,你还可以根据自己的需求创建自定义注解。

  1. 定义注解:

    • 使用 @interface 关键字定义注解。
    • 指定元注解 (@Retention, @Target 等)。
    • 定义注解成员。
  2. 使用注解:

    • 在程序元素(类、方法、字段等)上使用自定义注解,并为注解成员赋值(如果需要)。
  3. 处理注解 (Annotation Processing):

    • 编译时处理: 可以使用注解处理器 (Annotation Processor) 在编译时处理注解,生成代码或配置文件。 例如,Lombok 使用注解处理器自动生成 getter/setter 方法。
    • 运行时处理: 可以使用反射 API 在运行时获取注解信息,并根据注解信息执行相应的逻辑。

五、使用场景 (Annotation Usage Scenarios)

注解在 Java 中有着广泛的应用,主要包括以下场景:

  1. 编译时检查:

    • 使用 @Override 注解进行方法重写检查。
    • 使用 @SuppressWarnings 注解抑制编译器警告。
  2. 代码生成:

    • Lombok 使用注解处理器自动生成 getter/setter 方法、构造方法、equals()/hashCode() 方法等,简化代码编写。
    • JPA 使用注解来映射类和数据库表,生成 SQL 语句。
    • Spring MVC 使用注解来映射请求 URL 和处理方法。
  3. 配置:

    • Spring 使用注解来配置 Bean、依赖注入、事务管理、AOP 等。
    • JAX-RS 使用注解来定义 RESTful Web 服务。
  4. 运行时行为修改:

    • 单元测试框架 (例如 JUnit, TestNG) 使用注解来标记测试方法。
    • 安全框架 (例如 Spring Security) 使用注解来进行权限控制。
    • 序列化框架 (例如 Jackson, Gson) 使用注解来控制序列化和反序列化过程。

六、代码示例 (自定义注解)

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

@Retention(RetentionPolicy.RUNTIME) // 指定注解在运行时可用
@Target(ElementType.METHOD) // 指定注解可以应用于方法
public @interface MyAnnotation { // 定义一个自定义注解

    String name() default "Default Name"; // 成员变量,默认值Default Name
    int value();   // 成员变量

}

class MyClass {

    @MyAnnotation(name = "My Method", value = 100) // 使用注解并赋值
    public void myMethod() {
        System.out.println("My method is called.");
    }
}

public class AnnotationExample {

    public static void main(String[] args) throws Exception {
        Class<?> clazz = MyClass.class;
        Method method = clazz.getMethod("myMethod");

        if (method.isAnnotationPresent(MyAnnotation.class)) { // 判断方法是否使用了 MyAnnotation 注解
            MyAnnotation annotation = method.getAnnotation(MyAnnotation.class); // 获取注解对象

            System.out.println("Annotation name: " + annotation.name()); // 获取 name 成员的值
            System.out.println("Annotation value: " + annotation.value()); // 获取 value 成员的值
        }
    }
}

七、 总结

Java 注解是一种强大的元数据机制,它可以在代码中嵌入补充信息,并在编译时或运行时被处理。 理解注解的定义、元注解、内置注解、自定义注解以及使用场景,可以帮助你编写更简洁、更灵活、更易于维护的 Java 代码。 掌握注解,能让你更深入地理解各种框架和库的运作方式,并能够自定义 Spring Boot Starter等功能.

Java注解:讲解Java注解(Annotations)的概念,使用,并展示如何自定义注解,甚至框架级别的使用说明 关于Java注解的讲授,可以参考下面的大纲: 1. 注解的概念 1.1 介绍Annotation的基础概念 1.2 解释为何要使用Annotation 1.3 介绍Java中常见的内置注解 2. 注解的使用 2.1 展示如何在代码中使用注解 2.2 讲解各种元注解(@Target、@Retention、@Inherited、@Documented、@Repeatable)的含义和用法 3. 自定义注解 3.1 解释自定义注解的基本构造,包括注解的声明、要素(元素)的设置等 3.2 展示自定义注解的范例 阅读详情

相关推荐

今天我们要聊的是在 Spring Boot 中如何使用 Jackson 来实现自定义的序列化和反序列化

我们可以编写自定义的序列化器(Serializer)和反序列化器(Deserializer),并通过注册这些序列化器和反序列化器来控制序列化和反序列化的过程。除了上面提到的直接在类级别使用自定义序列化器外,我们还可以通过配置文件或者代码注册的方式,为特定类型注册自定义的序列化器和反序列化器。通过上述方法,我们可以在 Spring Boot 中灵活地控制 Jackson 的序列化和反序列化行为。

java专栏 1053

Annotation-注解实现原理探究与自定义注解示例展示

一、什么是注解? Annontation是Java5开始引入的新特征,中文名称叫注解。它提供了一种安全的类似注释的机制,用来将任何的信息或元数据(metadata)与程序元素(类、方法、成员变量等)进行关联。为程序的元素(类、方法、成员变量)加上更直观更明了的说明,这些说明信息是与程序的业务逻辑无关,并且供指定的工具或框架使用。Annontation像一种修饰符一样,应用于包、类型、构造方法、方法、成员变量、参数及本地变量的声明语句中。 Java注解是附加在代码中的一些元...

736

Java之注解(Annotations)篇!

哈喽,各位小伙伴们,你们好呀,我是喵手。运营社区:C站/掘金/腾讯云/阿里云/华为云/51CTO;欢迎大家常来逛逛

喵手的博客 437

java annotations详解_Java_注解_01_注解(Annotation)详解

一、注解的概念Annotation(注解)是插入代码中的元数据(元数据从metadata一词译来,就是“描述数据的数据”的意思),在JDK5.0及以后版本引入。它可以在编译期使用预编译工具进行处理, 也可以在运行期使用 Java 反射机制进行处理,用于创建文档,跟踪代码中的依赖性,甚至执行基本编译时检查。因为本质上,Annotion是一种特殊的接口,程序可以通过反射来获取指定程序元素的Annoti...

weixin_39926040的博客 618

从FinFET到NanoSheet:一文看懂TSMC制程技术的架构革命与性能飞跃

本文深入解析了TSMC从FinFET到NanoSheet的制程技术架构革命。FinFET通过三维立体结构解决了短沟道效应,而NanoSheet采用环绕栅极设计,实现了更强的静电控制与设计灵活性,结合EUV光刻技术,共同推动了芯片性能与能效的飞跃,为下一代AI与高性能计算奠定基石。

i3j4k5的博客 287

从理论到实践:全面解析Cmk(设备能力指数)的应用与优化

本文全面解析了设备能力指数Cmk的核心概念、计算逻辑与关键应用场景。Cmk作为衡量设备本身固有加工能力的黄金标准,在设备验收、大修后验证及过程能力根因分析中至关重要。文章通过实战案例,详细阐述了执行Cmk测试的“五大固定”黄金法则、数据计算分析方法,并提供了Cmk不达标时的系统性排查与优化策略,帮助制造企业实现预防性质量管理。

jump7的博客 521

Java注解(Annotations)的介绍和使用示例

Java注解(Annotations)是Java编程语言的一种形式,用于在代码中添加元数据。注解本身不会直接影响程序的逻辑,但可以通过工具或框架在编译时、类加载时或运行时进行处理。以下是关于Java注解的详细介绍和使用示例

jackiendsc的博客 626

三部对接 sora-2:OpenAI 最新视频模型快速接入指南

本文介绍OpenAI最新视频生成模型Sora-2的接入方案,重点解析其Chat格式调用功能。开发者可通过在提示词中嵌入"横屏/竖屏""时长""清晰度"等要求快速生成视频。文章分三部分:1)基础准备(环境配置与API密钥获取);2)核心调用(提供Python/Java示例代码);3)结果查询与优化建议。Sora-2支持多语言调用,简化了视频生成流程,适用于短视频、广告创意等场景。

2501_93565190的博客 3422

Java 中注解的详细介绍及使用

Java 注解,也称为 Java Annotations,是一种元数据(Meta-data)标记语言,它在 Java 代码中添加了额外的信息和说明。通过上述示例,我们可以看出注解在 Java 代码中的应用非常灵活,可以满足很多特殊需求。例如,我们可以通过自定义注解为某些方法添加事务支持、权限校验等功能,在实际的开发中具有很大的应用价值。当我们定义一个注解时,可以使用元注解(Meta-annotation)来指定注解的生命周期、作用范围等属性。接下来,我们通过一个具体的示例来说明如何定义和使用注解。

兴趣是最好的老师,勤能补拙 2509

嵌入式开发工程师笔试面试指南-Linux驱动

linux驱动

weixin_43491077的博客 473

2025年全国青少年信息素养大赛复赛真题(算法创意实践挑战赛C++初中组试卷1:带解析)(7月6日试卷)

2025年全国青少年信息素养大赛复赛真题(算法创意实践挑战赛C++初中组试卷1:带解析)(7月6日试卷)

王老师青少年编程 1953

Java 学习笔记 注解Annotations

自定义注解 1. @interface :用于声明注解 2. @Retentio :用于说定义注解的生命周期。 也就是保留到什么时候。具体看下面的代码注释说明。这是个元注解(声明注解时使用到的注解) 值域:java.lang.annotation.RetentionPolicy.* 下面的代码中有注释 3. @Target :用于说明注解可以加在那些代码上。 这是个元注解(声明注解时使用到的...

灵台方寸山斜月三星洞 2167

高通平台开发系列讲解(USB篇)MBIM协议详解

📢本文主要介绍高通平台USB网卡MBIM协议。

内核笔记 5438

Java中注解(Annotations)的使用

Java1.5版本后,引入Java注解,Java开发者可以自定义自己的注解满足业务的需求 Java引入注解后,也提供了注解的获取方式,在Class类中,可以通过getAnnotation()获取

木枫 893

极智芯 | 解读国产CPU之海光

大家好,我是极智视界,本文分享一下 解读国产CPU之海光。希望我的分享能对你的学习有一点帮助。

极智视界 3317

【WorkBuddy专栏28】WorkBuddy 网页抓取完全实战——从翻车到行云流水

WorkBuddy 网页抓取完全实战——从翻车到行云流水

AI人人懂 1049

java annotations详解_Java注解Annotations的详解以及使用实例

许多Api需要相当数量的样板代码。比如,为了写一个JAX-RPC网络服务。你必须提供一个成对的接口和实现,如果程序用注解装饰来表明哪个方法是远程可调用的那么这个样板代码就可以被一个工具自动生成。其他API需要“副文件”同时被维护。例如,JavaBeans需要一个BeanInfo类来和这个Bean同时维护,企业级的JavaBeans(EJB)需要一个部署描述符。如果通过注解用程序本身来维护这些副文...

weixin_42517963的博客 310

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

注解(annotations)

注解的格式 最简单的注解: @Entity @告诉编译器这是一个注解,以下的注解名是Override @Override 注解可以包含若干元素,元素有名字和值: @Author( name = "Benjamin Franklin", date = "3/27/2003" ) class MyClass() { ... } @SuppressWarnings(value = "u...

baidu_32223873的博客 798

汉书HE8,好用的汇编代码编写工具

汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大

蓝牙模块HM-10手册

蓝牙模块HM-10手册,该手册对蓝牙模块HM-10进行了详细的介绍和使用方法以及一些AT指令。

Java 注解 (Annotations)

Java 注解 (Annotations)

qq_34377273的博客 489

visio安装包

Microsoft Office Visio 是一款专业的制图软件。利用经过更新的形状、协作工具和数据链接图表,创建专业级图表以简化复杂的信息。

Java 注解(Annotations)(14/30)

注解是用符号标识的元数据,它们可以应用于类、方法、字段、参数等不同的位置。Java 预定义了一些常用的注解,同时开发者也可以根据需要创建自定义注解。Java 允许开发者创建自定义注解,用于特定场景的元数据标记。自定义注解通常结合注解处理器进行处理,能够显著减少样板代码并简化开发流程。使用@interface关键字可以定义自定义注解。自定义注解可以包含元素,这些元素可以用来存储注解的值。示例:定义自定义注解String value() default "默认值";在这个例子中,@Retention。

weidl001的博客 828

Java注解(Annotations)基础

1、注解能做什么? 源码:在源代码上做注释,生成文档注释 编译:编译时候检查代码错误和警告 JVM:可以利用Annotations生成代码,XML文件等 2、注解的使用 @注解名称(属性名=属性值,属性名={属性值1,属性值2,.......},.........) 在...

SH.blog 457

Annotations——@AliasFor注解和@Inherite注解

文章目录@AliasFor的作用几种@AliasFor的使用场景在同一个注解内显示使用 @AliasFor的作用 @AliasFor是一个Spring提供的注解,顾名思义,alias单词是别名的意思,可以看出这个注解是起别名用的。具体的例子,我们在其使用方式中一一列举。 几种@AliasFor的使用场景 在同一个注解内显示使用 我们摘一段RequestMapping注解中的代码来举例此种情况的使用...

Logger 2051

深入理解 Java 注解 (Annotations):从入门到自定义

Java 注解(Annotations)是Java 5引入的元数据机制,用于为代码添加标记信息。本文深入解析了注解的本质、分类和使用方式:首先介绍了内置注解如@Override、@Deprecated和@SuppressWarnings的作用;然后讲解了4种元注解(@Target、@Retention、@Documented、@Inherited)如何定义注解行为;最后通过自定义@LengthLimit注解案例,展示了如何通过反射机制在运行时读取和处理注解,实现字段长度验证功能。注解本身不包含逻辑,需要配合

qq_73685351的博客 654

Annotations

课程:注释 注释是元数据的一种形式,提供与程序相关但不属于程序本身的信息,不直接影响它标注的代码。 注释有以下作用: 为编译器提供信息——被编译器用来探测错误或抑制警报 编译时和部署时加工——软件工具可以通过加工注释信息来生成代码、XML文件等等 运行时加工:一些注释允许在运行时被检索 这个课程解释了哪里可以使用注释,如何应用注释,Java SE API中有哪些可用预定义注释,类型注释如何被用来与可插入类型系统的结合使用,以编写具有更强类型检查的代码。 注释基础 ...

weixin_42705402的博客 962
上一篇: Spring Boot 多模块怎么统一管理
下一篇: 反射机制在项目中的应用场景
冰糖心书房
博客等级 码龄15年 6014粉丝 690原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

冰糖心书房

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值