Java注解介绍

Java注解

    • 注解介绍
    • 元注解
      • @Retention
      • @Target
      • @Documented
      • @Inherited
        • 接口
        • 测试结果

注解介绍

Java注解(Annotation)是一种元数据(Metadata)的形式,它可以被添加到Java代码中的类、方法、变量、参数等元素上,以提供关于程序代码的额外信息。
在Java中,注解并不是一个Java类,而是一个特殊的接口类型(默认继承java.lang.annotation.Annotation接口),其实例在编译时被创建,并且在程序运行过程中可以通过反射获取相关信息。
注解里面定义的方法,代表的注解的成员属性,可以指定默认值(不指定默认值时,使用时必须指定对应的值)。在注解被使用时可以指定具体的的值,在编译时,会自动创建代理的注解对象,这个对象的属性不可修改(immutable)。

@Target({ElementType.TYPE, ElementType.METHOD})
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Conditional({OnClassCondition.class})
public @interface ConditionalOnClass {Class<?>[] value() default {};String[] name() default {};
}

在这里插入图片描述

元注解

Java中,元注解是用来修饰其它注解的注解。元注解是用来定义其它注解行为的注解。Java提供了常用的元注解:@Retention、@Target、@Documented、@Inherited。

@Retention

retention:保留;保持。
@Retention保留注解策略,只有这个元注解作用于注解时才有效;如果将元注解类型作用于另一个注解类型的成员属性(成员变量),则无效。
保留策略:RetentionPolicy.SOURCE、RetentionPolicy.CLASS、RetentionPolicy.RUNTIME。

  • RetentionPolicy.SOURCE:注解在编译时会被丢弃。只保留在源代码级别,可以用于编译器的静态检查和处理。
  • RetentionPolicy.CLASS:注解被保留在class文件中,但是运行时不可见,不能通过反射获取。对编译器可见,但是运行时不会产生任何效果。缺省的默认保留策略。
  • RetentionPolicy.RUNTIME:编译后被保存在class文件中,并且运行时能提供反射获取到。
@Documented
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.ANNOTATION_TYPE)
public @interface Retention {// 返回注解保留的策略RetentionPolicy value();
}

继承Retention注解

package com.oycm.spring_data_jpa.annotations.retention;import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;@Retention(RetentionPolicy.SOURCE)
public @interface RetentionSource {
}
package com.oycm.spring_data_jpa.annotations.retention;import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;@Retention(RetentionPolicy.SOURCE)
public @interface RetentionClass {}
package com.oycm.spring_data_jpa.annotations.retention;import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;@Retention(RetentionPolicy.RUNTIME)
public @interface RetentionRuntime {Class<RetentionClass> value();
}
package com.oycm.spring_data_jpa.annotations.retention;import java.lang.annotation.Annotation;
import java.lang.reflect.Field;/*** @author ouyangcm* create 2024/2/26 15:52*/
@RetentionSource
@RetentionClass
@RetentionRuntime(value = RetentionClass.class)
public class RetentionTest {@RetentionSource@RetentionClass@RetentionRuntime(value = RetentionClass.class)private String member;@RetentionSource@RetentionClass@RetentionRuntime(value = RetentionClass.class)private static String staticMember;public static void main(String[] args) {Class<RetentionRuntime> runtimeClass = RetentionRuntime.class;Class<RetentionTest> clazz = RetentionTest.class;Annotation[] annotations = clazz.getAnnotations();for (Annotation annotation : annotations) {System.out.println(annotation);}Field[] currentClassFields = clazz.getDeclaredFields();for (Field currentClassField : currentClassFields) {System.out.println("属性名: " + currentClassField.getName());Annotation[] fieldAnnotations = currentClassField.getAnnotations();for (Annotation fieldAnnotation : fieldAnnotations) {System.out.println("注解: " + fieldAnnotation.annotationType().getName());}}}
}

在这里插入图片描述
注意:反射获取的Annotation是一个代理对象,可以使用annotationType()方法获取真正的注解对象类信息。
在这里插入图片描述

@Target

@Documented
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.ANNOTATION_TYPE)
public @interface Target {// 注解目标类型数组ElementType[] value();
}

@Target注解用于指定注解可以应用的目标类型。类型有:ElementType.TYPE(类、接口(注解)、枚举等)、ElementType.FIELD(静态或非静态成员变量)、ElementType.METHOD(普通方法)、ElementType.PARAMETER(方法参数)、ElementType.CONSTRUCTOR(构造方法)、ElementType.LOCAL_VARIABLE(局部变量)、ElementType.ANNOTATION_TYPE(注解)、ElementType.PACKAGE(包)、ElementType.TYPE_PARAMETER(泛型)、ElementType.TYPE_USE(用于使用类型的任何地方)。

// 不能作用于其他类型上,只能作为其他注解的变量使用
@Target({})
public @interface MemberType {...
}// 类型重复出现,编译报错
@Target({ElementType.FIELD, ElementType.METHOD, ElementType.FIELD})
public @interface Bogus {...
}

@Documented

@Documented
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.ANNOTATION_TYPE)
public @interface Documented {
}

指示被标注的自定义注解是否应该包含再Java文档中。一个注解使用了@Document注解标注,那么使用javadoc工具生成文档时,这个注解的信息会被包含在文档中。

@Inherited

Inherited:继承的;遗传的。
表示类的注解是可继承的,使用getAnnotation()会自动查询该类的父类以获取所有的注解,直到Object类;这个元注解只在作用于类注解时才生效。

@Documented
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.ANNOTATION_TYPE)
public @interface Inherited {
}
@Inherited
@Retention(RetentionPolicy.RUNTIME)// 不可省略,不然获取不到
@Target(ElementType.TYPE)
public @interface MyInherited {
}
接口
package com.oycm.spring_data_jpa.annotations.inherited;@MyInherited
public interface InheritedInterface {
}
package com.oycm.spring_data_jpa.annotations.inherited;/*** @author ouyangcm* create 2024/2/26 17:22*/
public class InheritedInterfaceImpl implements InheritedInterface{
}
package com.oycm.spring_data_jpa.annotations.inherited;/*** @author ouyangcm* create 2024/2/26 17:22*/
@MyInherited
public class InheritedSuper {
}
package com.oycm.spring_data_jpa.annotations.inherited;/*** @author ouyangcm* create 2024/2/26 17:22*/
public class InheritedSuperSub extends InheritedSuper{
}
测试结果
package com.oycm.spring_data_jpa.annotations.inherited;/*** @author ouyangcm* create 2024/2/26 17:21*/
public class InheritedTest {public static void main(String[] args) {Class<InheritedInterface> inheritedInterfaceClass = InheritedInterface.class;Class<InheritedInterfaceImpl> inheritedInterfaceClassImpl = InheritedInterfaceImpl.class;// 这里获取到Annotation对象仍然是代理,不过两个是同一个对象.annotationType()可以获取真正的Class对象System.out.println(inheritedInterfaceClass.getAnnotation(MyInherited.class));System.out.println(inheritedInterfaceClass.getDeclaredAnnotation(MyInherited.class));System.out.println(inheritedInterfaceClassImpl.getAnnotation(MyInherited.class));System.out.println(inheritedInterfaceClassImpl.getDeclaredAnnotation(MyInherited.class));Class<InheritedSuper> inheritedSuperClass = InheritedSuper.class;Class<InheritedSuperSub> inheritedSuperSubClass = InheritedSuperSub.class;System.out.println(inheritedSuperClass.getAnnotation(MyInherited.class));System.out.println(inheritedSuperClass.getDeclaredAnnotation(MyInherited.class));System.out.println(inheritedSuperSubClass.getAnnotation(MyInherited.class));System.out.println(inheritedSuperSubClass.getDeclaredAnnotation(MyInherited.class));// 只能获得自己的注解}
}

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/271646.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

AI时代PPT如何制作?用这10款pptai生成器一键制作!

ppt如何制作&#xff1f; 这可能是很多职场人或大学生日常头疼的问题&#xff0c;职场上随便一个工作汇报、提案展示、团队会议&#xff0c;学校里的小组作业、论文答辩等场景&#xff0c;都会用到ppt。 都说人是视觉动物&#xff0c;在两份文档内容质量一致的情况下&#xf…

Linux的top命令解析

Top命令是什么 TOP命令是Linux下常用的性能分析工具&#xff0c;能够实时显示系统中各个进程的资源占用状况。 TOP是一个动态显示过程,即可以通过用户按键来不断刷新当前状态.如果在前台执行该命令,它将独占前台,直到用户终止该程序为止.比较准确的说,top命令提供了实时的对系…

Day16:信息打点-语言框架开发组件FastJsonShiroLog4jSpringBoot等

目录 前置知识 指纹识别-本地工具-GotoScan&#xff08;CMSEEK&#xff09; Python-开发框架-Django&Flask PHP-开发框架-ThinkPHP&Laravel&Yii Java-框架组件-Fastjson&Shiro&Solr&Spring 思维导图 章节知识点 Web&#xff1a;语言/CMS/中间件/…

【物联网】stm32芯片结构组成,固件库、启动过程、时钟系统、GPIO、NVIC、DMA、UART以及看门狗电路的全面详解

一、stm32的介绍 1、概述 stm32: ST&#xff1a;指意法半导体 M&#xff1a;指定微处理器 32&#xff1a;表示计算机处理器位数 与ARM关系:采用ARM推出cortex-A&#xff0c;R,M三系中的M系列&#xff0c;其架构主要基于ARMv7-M实现 ARM分成三个系列&#xff1a; Cortex-A&…

开源模型应用落地-工具使用篇-Ollama(六)

一、前言 在AI大模型百花齐放的时代&#xff0c;很多人都对新兴技术充满了热情&#xff0c;都想尝试一下。但是&#xff0c;实际上要入门AI技术的门槛非常高。除了需要高端设备&#xff0c;还需要面临复杂的部署和安装过程&#xff0c;这让很多人望而却步。不过&#xff0c;随着…

RFID-科技的“隐秘耳语者”

RFID-科技的“隐秘耳语者” 想象一下&#xff0c;你身处一个光线昏暗的环境中&#xff0c;周围的一切都被厚厚的阴影笼罩。这时&#xff0c;你需要识别并获取一个物体的信息&#xff0c;你会选择怎么做&#xff1f;是点亮灯光&#xff0c;用肉眼仔细观察&#xff0c;还是打开扫…

神经网络的矢量化,训练与激活函数

我们现在再回到我们的神经元部分&#xff0c;来看我们如何用python进行正向传递。 单层的正向传递&#xff1a; 我们回到我们的线性回归的函数。我们每个神经元通过上述的方法&#xff0c;就可以得到我们的激发值&#xff0c;从而可以继续进行下一层。 我们用这个方法就可以得…

智慧城市如何助力疫情防控:科技赋能城市安全

目录 一、引言 二、智慧城市与疫情防控的紧密结合 三、智慧城市在疫情防控中的具体应用 1、智能监测与预警系统 2、智慧医疗与健康管理 3、智能交通与物流管理 4、智慧社区与基层防控 四、科技赋能城市安全的未来展望 五、结论 一、引言 近年来&#xff0c;全球范围内…

Platformview在iOS与Android上的实现方式对比

Android中早期版本Platformview的实现基于Virtual Display。VirtualDisplay方案的原理是&#xff0c;先将Native View绘制到虚显&#xff0c;然后Flutter通过从虚显输出中获取纹理并将其与自己内部的widget树进行合成&#xff0c;最后作为Flutter在 Android 上更大的纹理输出的…

链表|206.反转链表

力扣题目链接 struct ListNode* reverseList(struct ListNode* head){//保存cur的下一个结点struct ListNode* temp;//pre指针指向前一个当前结点的前一个结点struct ListNode* pre NULL;//用head代替cur&#xff0c;也可以再定义一个cur结点指向head。while(head) {//保存下…

测试常用的Linux命令

前言 直接操作硬件 将把操作硬件的代码封装成系统调用&#xff0c;供程序员使用 虚拟机软件 可以模拟的具有完整硬件系统的功能 可以在虚拟机上安装不同的操作系统 Linux内核只有一个&#xff0c;发行版有很多种 内核来运行程序和管理像磁盘和打印机等硬件设备的核心程序 终端…

高清数学公式视频素材、科学公式和方程式视频素材下载

适用于科普、解说的自媒体视频剪辑素材&#xff0c;黑色背景数学、科学公式和方程式视频素材下载。 视频编码&#xff1a;H.264 | 分辨率&#xff1a;3840x2160 (4K) | 无需插件 | 文件大小&#xff1a;16.12MB 来自PR视频素材&#xff0c;下载地址&#xff1a;https://prmuban…

NTFS Disk by Omi NTFS for mac v1.1.4中文版

NTFS Disk by Omi NTFS for Mac&#xff1a;NTFS文件系统的无缝桥梁 软件下载&#xff1a;NTFS Disk by Omi NTFS for mac v1.1.4中文版 &#x1f310; 跨平台访问&#xff0c;文件无阻 NTFS Disk by Omi NTFS for Mac 为您的Mac提供了对NTFS文件系统的无缝访问。无论您是在Win…

Crow 编译和环境搭建

Crow与其说是编译&#xff0c;倒不如说是环境搭建。Crow只需要包含头文件&#xff0c;所以不用编译生成lib。 Crow环境搭建 boost&#xff08;可以不编译boost&#xff0c;只需要boost头文件即可&#xff09;asio &#xff08;可以不编译&#xff0c;直接包含头文件。不能直接…

Ethersacn的交易数据是什么样的(2)

分析 Raw Transanction RLP&#xff08;Recursive Length Prefix&#xff09;是一种以太坊中用于序列化数据的编码方式。它被用于将各种数据结构转换为二进制格式&#xff0c;以便在以太坊中传输和存储。RLP 是一种递归的编码方式&#xff0c;允许对复杂的数据结构进行编码。所…

typeorm-入门

简述 typeorm是一个数据库orm框架&#xff0c;在nestjs官网中有提到&#xff0c;可以充分发挥利用typescript的特性&#xff0c;当然也支持js其中涉及的概念包括 DataSource 数据源&#xff0c;Connection 连接数据库Entity 实体&#xff0c;实体类映射数据库表Relation 关系…

redis实现分布式全局唯一id

目录 一、前言二、如何通过Redis设计一个分布式全局唯一ID生成工具2.1 使用 Redis 计数器实现2.2 使用 Redis Hash结构实现 三、通过代码实现分布式全局唯一ID工具3.1 导入依赖配置3.2 配置yml文件3.3 序列化配置3.4 编写获取工具3.5 测试获取工具 四、运行结果 一、前言 在很…

安康杯安全知识竞赛上的讲话稿

各位领导、同志们&#xff1a; 经过近半个月时间的准备&#xff0c;南五十家子镇平泉首届安康杯安全生产知识竞赛初赛在今天圆满落下帏幕&#xff0c;经过紧张激烈的角逐&#xff0c; 代表队、 代表队和 代表队分别获得本次竞赛的第一、二、三名让我们以热烈的掌声表示祝…

LLM PreTraining from scratch -- 大模型从头开始预训练指北

最近做了一些大模型训练相关的训练相关的技术储备&#xff0c;在内部平台上完成了多机多卡的llm 预训练的尝试&#xff0c;具体的过程大致如下&#xff1a; 数据准备&#xff1a; 大语言模型的训练依赖于与之匹配的语料数据&#xff0c;在开源社区有一群人在自发的整理高质量的…

读《文明之光》第1册总结

人类几千年的文明史和地球的历史相比&#xff0c;实在是太短暂了&#xff0c;大约相当于几分钟和一年的关系。人类已经走过的路&#xff0c;相比今后要走的漫漫长路&#xff0c;只能算是刚刚起步。如果跳出一个个具体事件&#xff0c;站在历史的高度去看&#xff0c;我们会发现…