java中Annotation详解

article/2025/10/14 12:47:26

Java 注解(Annotation)又称 Java 标注,是 JDK5.0 引入的一种注释机制。主要作用:Annotation其实是代码里的特殊标记,这些标记可以在编译、类加载、运行时被读取,并执行相应的处理。通过使用Annotation,程序开发人员可以在不改变原有逻辑的情况下,在源文件嵌入一些补充信息。如代码分析工具、开发工具和部署工具可以通过这些补充信息进行验证或者进行部署,比如Junit矿建,Spring框架。

Java 语言中的类、方法、变量、参数和包等都可以被标注。和 Javadoc 不同,Java 标注可以通过反射获取标注内容。在编译器生成类文件时,标注可以被嵌入到字节码中。Java 虚拟机可以保留标注内容,在运行时可以获取到标注内容 。 当然它也支持自定义 Java 标注。

内置的注解

java 定义了一套注解,共有 10 个,5 个在 java.lang 中,剩下5 个在 java.lang.annotation 中。

用于在代码的注解:

  • @Override - 检查该方法是否是重写方法。如果发现其父类,或者是引用的接口中并没有该方法时,会报编译错误。
  • @Deprecated - 标记过时方法。如果使用该方法,会报编译警告。
  • @SuppressWarnings - 标注的额内容产生的警告,编译器会对这些警告保持静默。
  • @SafeVarargs - Java 7 开始支持,忽略任何使用参数为泛型变量的方法或构造函数调用产生的警告。
  • @FunctionalInterface - Java 8 开始支持,标识一个函数式接口。

用于在其他注解的注解(元注解):

  • @Retention - 标识这个注解怎么保存,是只在代码中,还是编入class文件中,或者是在运行时可以通过反射访问。
  • @Documented - 标记这些注解是否出现在用户文档中。即:如果定义Annotation类时使用了@Documented修饰,则所有使用该Annotation修饰的程序元素的API文档中将会包含该Annotation说明。
  • @Target - 标记这个注解可以标记哪种 Java 成员。
  • @Inherited - 表示在子类中继承了父类中用此注解类型标注的注解,即:如果A继承了C,而C使用了B Annotation(定义B时使用了@Inherited修饰)修饰,则子类A将自动具有B注释。
  • @Repeatable - Java 8 开始支持,标识某注解可以在同一个声明上使用多次。

在java.lang.annotation包中主要有三种重要类型:

1.Annotation

2.ElementType 

public enum ElementType { TYPE, //类、接口(包括注解接口)、枚举声明FIELD,//字段(包括枚举常量)METHOD,//方法声明PARAMETER,//参数声明CONSTRUCTOR,//构造方法声明LOCAL_VARIABLE,//局部变量声明ANNOTATION_TYPE,//注释类型声明PACKAGE,//包声明//ElementType.TYPE_USER和ElementType.TYPE_PARAMETER是Java 8新增的两个注解,//用于描述注解的使用场景TYPE_PARAMETER,//作为参数使用TYPE_USE//作为类型使用
}
public class Annotations {@Retention( RetentionPolicy.RUNTIME )@Target( { ElementType.TYPE_USE, ElementType.TYPE_PARAMETER } )public @interface NonEmpty {        }public static class Holder< @NonEmpty T > extends @NonEmpty Object {public void method() throws @NonEmpty Exception {            }}@SuppressWarnings( "unused" )public static void main(String[] args) {final Holder< String > holder = new @NonEmpty Holder< String >();        @NonEmpty Collection< @NonEmpty String > strings = new ArrayList<>();        }
}

3.RetentionPolicy

public enum RetentionPolicy {SOURCE, //Annotation信息仅存在于编译器处理期间,编译器处理完之后就没有该Annotation信息了    CLASS,//编译器将Annotation存储于类对应的.class文件中。默认行为RUNTIME//编译器将Annotation存储于class文件中,并且可由JVM读入,可通过反射获取
}

(01) Annotation 就是个接口。

"每 1 个 Annotation" 都与 "1 个 RetentionPolicy" 关联,并且与 "1~n 个 ElementType" 关联。可以通俗的理解为:每 1 个 Annotation 对象,都会有唯一的 RetentionPolicy 属性;至于 ElementType 属性,则有 1~n 个。

(02) ElementType 是 Enum 枚举类型,它用来指定 Annotation 的类型。

"每 1 个 Annotation" 都与 "1~n 个 ElementType" 关联。当 Annotation 与某个 ElementType 关联时,就意味着:Annotation有了某种用途。例如,若一个 Annotation 对象是 METHOD 类型,则该 Annotation 只能用来修饰方法。

(03) RetentionPolicy 是 Enum 枚举类型,它用来指定 Annotation 的策略。通俗点说,就是不同 RetentionPolicy 类型的 Annotation 的作用域不同。

  •  若 Annotation 的类型为 SOURCE,则意味着:Annotation 仅存在于编译器处理期间,编译器处理完之后,该 Annotation 就没用了。 例如," @Override" 标志就是一个 Annotation。当它修饰一个方法的时候,就意味着该方法覆盖父类的方法;并且在编译期间会进行语法检查!编译器处理完后,"@Override" 就没有任何作用了。
  • 若 Annotation 的类型为 CLASS,则意味着:编译器将 Annotation 存储于类对应的 .class 文件中,它是 Annotation 的默认行为。
  • 若 Annotation 的类型为 RUNTIME,则意味着:编译器将 Annotation 存储于 class 文件中,并且可由JVM读入,可以通过反射在运行时获取。

 自定义Annotation

定义新的Annotation类型使用@interface关键字。

public @interface Login {}

Annotation不仅可以是这种简单Annotation,Annotation还可以带成员变量,Annotation的成员变量在Annotation定义中必须以无参数方法的形式声明。其方法名和返回值定义了该成员的名字和类型。

/*** 定义一个注解*/
public @interface Login {//定义两个成员变量String username();String password();
}
//一旦在Annotation里定义了成员变量之后,使用该Annotation时应该为该Annotation的成员变量指定值
class LoginTest{//使用注解 @Login(username="lisi", password="111111")public void login(){//todo       }
}
//带有默认值的注解
public @interface Login2 {//定义两个成员变量,以default为两个成员变量指定初始值String username() default "zhangsan";String password() default "123456";
}class LoginTest2{//因为它的成员变量有默认值,所以可以无须为成员变量指定值,而直接使用默认值@Loginpublic void login(){}
}

一旦在Annotation里定义了成员变量之后,使用该Annotation时应该为该Annotation的成员变量指定值,我们还可以在定义Annotation的成员变量时为其指定初始值,指定成员变量的初始值可使用default关键字。如果为Annotation的成员变量指定了默认值,使用该Annotation则可以不为这些成员变量指定值,而是直接使用默认值。

根据我们介绍的Annotation是否可以包含成员变量,我们可以把Annotation分为如下两类:

  • 标记Annotation: 一个没有成员定义的Annotation类型被称为标记。这种Annotation仅使用自身的存在与否来为我们提供信息。如前面介绍的@Override。
  • 元数据Annotation:那些包含成员变量的Annotation,因为它们可接受更多元数据,所以也被称为元数据Annotation。
@java.lang.annotation.Target(java.lang.annotation.ElementType.FIELD)
@java.lang.annotation.Retention(java.lang.annotation.RetentionPolicy.RUNTIME)
public @interface MyAnnotation{public String value();
}
//先反射获取字段,再通过字段获取注释,再通过注释获取值。
MyAnnotation fieldAnn = field.getAnnotation(MyAnnotation.class);
if (fieldAnn != null)name = fieldAnn.value();

一个完整的自定义Annotation已经完。

提取Annotation的信息

在jdk1.5时,Java在java.lang.reflect包下新增了AnnotateElement接口,该接口代表程序中可以接受注释的程序元素,该接口主要有如下几个实现类(注意以下是类):

  • Class:类定义。
  • Constructor:构造器定义。
  • Field:类的成员变量定义。
  • Method:类的方法定义。
  • Package:类的包定义

AnnotatedElement接口是所有程序元素(如Class、Method、Constructor)的父接口,所以程序通过反射获取了某个类的AnnotatedElement对象(如Class、Method、Constructor)之后,程序就可以调用该对象的如下三个等方法来访问Annotation信息:

  1. getAnnotation(Class<T> annotationClass);  //返回该程序元素上存在的、指定类型的注释,如果该类型的注释不存在,则返回null。获取注释类型后就可以通过定义注释时的无参方法获取改注释的字段值。如上图。
  2. Annotation[] getAnnotations();      //返回该程序元素上存在的所有注释。
  3. boolean isAnnotationPresent(Class<? extends Annotation> annotationClass);      //判断该程序元素上是否包含指定类型的注解,存在则返回true,否则返回false。

http://chatgpt.dhexx.cn/article/bxgodHtg.shtml

相关文章

深入理解Java注解类型(@Annotation)

【版权申明】未经博主同意&#xff0c;谢绝转载&#xff01;&#xff08;请尊重原创&#xff0c;博主保留追究权&#xff09; http://blog.csdn.net/javazejian/article/details/71860633 出自【zejian的博客】 关联文章&#xff1a; 深入理解Java类型信息(Class对象)与反射…

【Spring AOP】@Aspect结合案例详解(一): @Pointcut使用@annotation + 五种通知Advice注解(已附源码)

文章目录 前言AOP与Spring AOPAspect简单案例快速入门 一、Pointcutannotation 二、五种通知Advice1. Before前置通知2. After后置通知3. AfterRunning返回通知4. AfterThrowing异常通知5. Around环绕通知 总结 前言 在微服务流行的当下&#xff0c;在使用SpringCloud/Springb…

Annotation理解及运用

什么是Annotation 我们在平时的开发过程中看到很多如@Override,@SuppressWarnings,@Test等样式的代码就是注解,注解是放到类、构造器、方法、属性、参数前的标记。 Annotation概念 Annontation是Java5开始引入的新特征。中文名称一般叫注解。它提供了一种安全的类似注释的…

Annotation介绍

Annotation思维导图

AnnotationProcessor 处理器不工作怎么定位?

什么是 Annotation Processor 构建问题 写过自定义注解处理器的老司机们乍一看这个问题觉得挺简单&#xff0c;是的&#xff0c;因为网上基本通篇都在教你怎么打日志&#xff0c;但是你有没有想过如果连日志都打印不出来的时候你怎么定位呢&#xff1f;譬如如下代码&#xff1…

annotation-driven 配置详解

一、前沿 在 Spring MVC 的项目中&#xff0c;我们经常使用 <mvc:annotation-driven> 这个配置&#xff0c;那么这个配置到底是做什么的呢&#xff1f;下面来分析一下&#xff0c;首先找到 mvc 的命名空间的定义&#xff0c;如下图&#xff1a; 从上述图中可知&#xff…

深入JAVA注解(Annotation):自定义注解

一、基础知识&#xff1a;元注解 要深入学习注解&#xff0c;我们就必须能定义自己的注解&#xff0c;并使用注解&#xff0c;在定义自己的注解之前&#xff0c;我们就必须要了解Java为我们提供的元注解和相关定义注解的语法。 元注解&#xff1a; 元注解的作用就是负责注解其…

Java:annotation注解的简单理解和总结

Java annotation 注解Annotation1、Annotation的概述1.1、定义1.2、Annotation作用分类1.3、Annotation 架构 2、Annotation的语法形式3、Annotation的分类3.1、基本注解3.2、元注解3.2.1、Target3.2.2、Retention3.2.3、Documented3.2.4、Inherited: 4、自定义annotation4 .1、…

java注解的jar包_Java 注解 Annotation

目录: 从 JDK5 开始,Java 增加了对元数据(MetaData)的支持,也就是 Annotation。Annotation 其实就是代码里面的特殊标记,这些标记可以在编译、类加载、运行时被读取,并执行相应的处理。通过使用注解,开发人员可以在不改变原有逻辑的情况下,在源文件中嵌入一些补充信息。…

Java Annotation Processing 概述

文章目录 JAVA ANNOTATION PROCESSING引言代码实现annotation-processor实现一个 Processor创建 AbstractProcessor 的子类 app 测试Reference JAVA ANNOTATION PROCESSING 引言 源码级别的注解处理最开始出现于 JAVA 5 中, 它提供了一种在编译期生成额外 “源文件” 的机制.…

annotation matlab,matlab 关于annotation函数的一点用法

这几天做毕设&#xff0c;用到了matlab的一些功能&#xff0c;先吐槽一下matlab的官方api写的是真的不好&#xff0c;很多东西不解释清楚。 首先对于所有的annotation函数&#xff0c;里面不论是维度还是大小参数&#xff0c;都是归一化到[0,1]之间的&#xff0c;也就是说&…

Android AnnotationProcessor

Android AnnotationProcessor 一.项目结构二.定义注解三.实现注解处理器(一)依赖(二)注解处理器(三)处理注解 四.使用注解处理器(一)依赖(二)使用注解(三)生成的代码 五.注意事项 注解处理器通常可以用在模块间解藕、自动生成代码等地方&#xff0c;比如router路由或者butterkn…

Annotation Processor

annotationProcessor和android-apt的功能是一样的&#xff0c;它们是替代关系。annotationProcessor是APT工具中的一种&#xff0c;他是google开发的内置框架&#xff0c;不需要引入&#xff0c;可以直接在build.gradle文件中使用。android-apt是由一位开发者自己开发的apt框架…

annotation是什么,用处,举例

1.概念&#xff1a;注解Annotation是java 1.5的新特性&#xff0c;是一种能够添加到 Java 源代码的语法元数据。类、方法、变量、参数、包都可以被注解&#xff0c;可用来将信息元数据与程序元素进行关联。Annotation 中文常译为“注解”。 2.用处&#xff1a; (1)生成文档。这…

Web大学生网页作业成品:个人博客主页 (纯HTML+CSS代码)

Web前端开发技术 描述 网页设计题材&#xff0c;DIVCSS 布局制作,HTMLCSS网页设计期末课程大作业 | 个人博客网站 | 个人主页介绍 | 个人简介 | 个人博客设计制作 | 等网站的设计与制作 | 大学生个人HTML网页设计作品 | HTML期末大学生网页设计作业 HTML&#xff1a;结构 CSS&…

vue搭建博客

使用vue2.0/3.0搭建博客&#xff0c;前端情绪员 实现原理安装nodejs和vue写项目项目打包和托管项目创建github仓库安装git托管项目到github仓库检查仓库并设置pages购买域名和解析域名修改更新项目ps(gitee搭建vue博客) 实现原理 使用vue打包出来的dist&#xff0c;把dist中的…

博客中动态图的制作

在博客中的动态图片的制作&#xff0c;可以在Android Studio里面连上手机进行视频的录制。之后用在视频的基础上用gifcam软件转化成gif动态图&#xff1a; 下载gitcam绿色版软件进行视频的处理&#xff1a; 打开GIFcam转化成gif格式的动态图&#xff1a;

手把手,从零开始搭建个人博客网站(附源码)

项目介绍 一、项目功能&#xff1a; 实现登录功能 密码数据加密 用户管理功能&#xff08;用户增删改查&#xff09; 文章管理功能&#xff08;文章增删改查&#xff09; 文章首页展示 文章评论功能&#xff08;需登录&#xff09; 首页文章展示、 用户管理、文章管理的…

HTML5+CSS编写个人博客界面

刚入门html和css&#xff0c;花了一天入门基础&#xff0c;第二天花了五六个小时完成老师布置的作业——个人博客界面&#xff0c;初学者可以进行参考编写。 注&#xff1a;里面的链接都不能点击 废话少说&#xff0c;看结果&#xff1a; 参考代码&#xff1a; microbloy.htm…

js个人博客设计大作业

视频演示&#xff1a; 大作业演示 图片看效果&#xff1a; 网站规划设计 1.结构设计 共设计3个HTML界面&#xff1a;一个登陆界面&#xff0c;一个注册界面&#xff0c;以及主页面&#xff1b; 2.内容规划 登陆界面包含logo&#xff0c;输入用户名&#xff0c;输入密码和登…