Java 注解使用

news2024/11/24 8:49:10

一、注解简介

        注解是那些插入到源代码中使用其他工具可以对其进行处理的标签。这些工具可以在源码层次上进行操作,或者可以处理编译器在其中放置了注解的类文件。

        注解不会改变程序的编译方式。Java编译器对于包含注解和不包含注解的代码会生成相同的虚拟机指令。

        为了能够受益于注解,你需要选择一个处理工具,然后向你的处理工具可以理解的代码中插入注解,之后运用该处理工具处理代码。

Java中,注解是当作一个修饰符来使用的,它被置于被注解项之前,中间没有分号。每一个注解的名称前面都加上了@符号。

二、注解语法

1、注解的定义

注解是由注解接口来定义的:

modifiers @interface AnnotationName {
    elementDeclaration1
    elementDeclaration2
    ...
}

每个元素的声明都具有下面这种形式:

type elementName();

 或者

type elementName() default value;

比如我们常用,Spring中用来标记为Bean的注解定义:其中包含一个元素:value

public @interface Component {
    String value() default "";
}

        所有的注解接口都隐式的扩展自java.lang.annotation.Annotation接口,这个接口是一个常规接口,不是一个注解接口。你无法扩展注解接口,换句话说,所有的注解接口都直接扩展自java.lang.annotation.Annotation。

注解元素的类型为下列之一:

  • 基本类型(int、short、long、byte、char、double、boolean)
  • String
  • Class(具有一个可选的类型参数,例如Class<? extends MyClass>)
  • enum类型
  • 注解类型
  • 上述所述类型组成的数组

下面是个合法的元素声明的例子:

public @interface BugReport {
    enum Status { UNCONFIRMED, CONFIRMED, FIXED, NOTABUG };

    boolean showStopper() default false;
    String assignedTo() default "[none]";
    Class<?> testCase() default Void.class;
    Status status() default Status.UNCONFIRMED;
    Reference ref() default @Reference(); // an annotation type
    String[] reportedBy();
}

2、注解的使用

@BugReport(severity=10, assignedTo="Harry")

        其中元素的顺序无关紧要,如果某个元素的值未指定,那么就会使用声明的默认值。

        可以简化写法:如果没有指定元素,要么是因为注解中没有元素,或者使用默认值,这个时候就不用使用圆括号了()。例如:@BugReport。这样的注解又称为标记注解。

        另外一个快捷方式是单值注解。如果元素具有特殊名字value,并且没有指定其他元素,那么就可以忽略掉这个元素名以及等号。例如:@Component("beanName")。

值得注意的是:

  • 因为注解是由编译器计算而来的,因此,所有元素的值必须是编译器常量。
  • 一个注解元素永远不能设置为null,甚至不允许默认值为null,这样在实际应用中会相当不方便,必须使用其他默认值。

如果元素值是一个数组,需要将它的值用括号括起来:

@BugReport(. . . reportedBy={"Harry","Carl"})

如果数组元素是个单值,则可以忽略括号:

@BugReport(. . . reportedBy="Harry")

3、注解的各类声明

        注解可以出现在许多地方,这些地方可以分为两类:声明和类型用法声明注解可以出现在下列声明处:

  • 类(包括enum)
  • 接口(包括注解接口)
  • 方法
  • 构造器
  • 实例域(包含enum常量)
  • 局部变量
  • 参数变量
  • 类型参数

对于类和接口,需将注解放在class和interface关键词前面。

对于变量,需将注解放置在类型的前面

泛化类或方法中的参数可以像下面这样被注解

public class Cache<@Immutable V> {.....}

包是在文件package-info.java中注解的,该文件只包含以注解先导的包语句。

/**
Package-level Javadoc
*/
@GPL(version="3")
package com.horstmann.corejava;
import org.gnu.GPL;

三、标准注解

        Java SE在java. lang、java.lang.annotation和javax.annotation包中定义了大量的注解接口。其中四个是元注解,用于描述注解接口的行为属性,其他的三个是规则接口,可以用它们来注解你的源代码中的项。下表列出了这些注解。

 1、用于编译的注解

@Deprecated注解可以被添加到任何不在被鼓励使用的项上,所以当使用一个过期的项时,编译器将会发出警告,这个注解与javadoc标签@deprecated具有同等功效。

@SuppressWarnings注解会告知编译器阻止特定类型的警告信息。

@Override这种注解只能用到方法上,编译器会检查这种注解的方法是否真正的覆盖了一个来自于超类的方法。

@Generated注解的目的是供代码生成工具来使用。

2、用于管理资源的注解

@PostConstruct@PreDestroy注解用于控制对象生命周期的环境中,标记了这些注解的方法应该在对象被构建之后,或者在对象被移除之前,紧接着调用。

@Resource注解用于资源注入。

3、元注解

3.1、@Target元注解

        @Target元注解可以应用于一个注解,以限制该注解可以应用到哪些项上。下表显示了所有可能的取值情况,它们属于枚举类型ElementType,可以指定任意数量的元素类型,用括号括起来。

         一条没有@Target限制的注解可以应用于任何项上。

3.2、@Retention元注解

        @Retention元注解用于指定一条注解应该保留多长时间,默认值是RetentionPolicy.CLASS。其他类型如下表所示:

 3.3、@Documented元注解

        @Documented元注解为像Javadoc这样的归档工具提供了一些提示,以实现其归档。

注意:将一个注解应用到它自身身上是合法的,例如@Documented注解被自身注解为@Documented。

3.4、@Inherited元注解

        @Inherited元注解只能应用于对类的注解。如果一个类具有继承注解,那么它的所有子类都自动具有同样的注解。

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

7种优秀的电商API命名方式

本文通过展示7种优秀API命名实践&#xff0c;来协助您创建高效的API端点&#xff0c;为用户提供更好的使用体验。 如今&#xff0c;API已成为了现代化编程的基本组成部分。它们不但能够改善不同开发团队的协作、并鼓励创新&#xff0c;而且能够提高应用程序的安全性。而作为两…

用PCB加热PCB——PCB加热台

之前为了焊接一些小贴片模块&#xff0c;想过买一个加热台&#xff0c;后来一搜加热台&#xff0c;发现有很多卖PTC加热板的&#xff0c;就又想自己做一个加热台。正好这个月嘉立创又送了打样券&#xff0c;搞起来~ PCB加热台设计主要考虑以下几个方面&#xff1a; 面积功率铜…

【方法】电脑如何打开Heic文件?

存放在电脑里的Heic文件打不开&#xff1f;相信有小伙伴也遇到过这样的问题。 因为Heic是苹果升级到ios11之后&#xff0c;在拍摄照片时的默认图像存储格式&#xff0c;只能兼容苹果系列产品&#xff0c;不能在Windows电脑里打开。&#xff08;Windows10 RS4开始支持该格式&am…

概率论的学习和整理18:为什么 P(至少成功1次概率) = Σ p(几何分布概率之和)----(未完成)

我们计算几何概率时&#xff0c;会很容易发现这么一个特点 我们很容易计算 试验n次&#xff0c;连续成功概率试验n次&#xff0c;连续失败概率试验n次&#xff0c;至少成功1次概率试验n次&#xff0c;最后一次成功概率试验n次&#xff0c;成功k次概率试验n次&#xff0c;累计成…

python3的全局解释器锁是什么意思?有什么要注意的?

Python中的全局解释器锁&#xff08;Global Interpreter Lock&#xff0c;GIL&#xff09;是一种机制&#xff0c;用于确保在任何给定时间只有一个线程执行Python字节码。GIL是由Python解释器实现的&#xff0c;对于CPython解释器来说是存在的&#xff0c;其他一些Python解释器…

[chatgpt+Azure]unity AI二次元小女友之使用微软Azure服务实现RestfulApi->语音识别+语音合成

1.简述 如题所述&#xff0c;这个小项目是在unity引擎端&#xff0c;使用了chatgpt微软azure的一个AI二次元女友对话的项目&#xff0c;实现原理也比较简单&#xff0c;即在unity端实现AI二次元女友的交互界面&#xff0c;接入chatgpt-3.5-turbo的api接口&#xff0c;借助chatg…

探讨餐饮行业油烟污染与治理措施

安科瑞 华楠 摘 要&#xff1a; 近年来我国餐饮行业油烟污染已成为城市大气污染的主要来源之一。如今环境问题日益突出严重制约到人们的身体健康&#xff0c;需要引起重视采取一系列有效的措施来治理餐饮行业的油烟污染。 关键词&#xff1a;餐饮业&#xff1b;污染&#xf…

STM32驱动ADS1256串口输出-AD转换

STM32驱动ADS1256串口输出-AD转换 ADS1256ADS1256简介芯片特点引脚说明模块相关寄存器与命令相关程序初始化 实验效果接线实验现象 ADS1256 ADS1256简介 ADS1256是TI推出的一款微功耗、高精度、8 通道、24 位高性能模数转换器。该芯片还带有4个可编程的I/O口、输入缓冲器和可编…

Spring依赖注入Bean类型的8种情况详解

1、普通对象 这没什么好说的&#xff0c;大家都这么用的&#xff0c;比如需要用到 UserService&#xff0c;直接 Autowired 就可以了。 Autowired private UserService userService;2、Collection 及其子接口 除了支持注入一个单一的对象之外&#xff0c;Autowired 还支持注…

100天精通Golang(基础入门篇)——第16天:深入解析Go语言包的使用和包管理

&#x1f337; 博主 libin9iOak带您 Go to Golang Language.✨ &#x1f984; 个人主页——libin9iOak的博客&#x1f390; &#x1f433; 《面试题大全》 文章图文并茂&#x1f995;生动形象&#x1f996;简单易学&#xff01;欢迎大家来踩踩~&#x1f33a; &#x1f30a; 《I…

java微信公众号新建草稿并发布

java实现公众号发起新建草稿&#xff0c;并且发布得到文章链接首先要先去微信公众号的设置与开发–基础设置 查看公众号的各个参数&#xff0c;这里我是存储到数据库&#xff0c;方便后期使用&#xff0c;实体类如下&#xff1a; Data public class WeChatOfficial {private st…

蛙色Web3D编辑器全面更新,会员能力解析

导语&#xff1a; 在数字化时代&#xff0c;创意设计和虚拟展示成为了营销领域的关键。然而&#xff0c;传统的创作方式往往需要复杂的软件和技术支持&#xff0c;给用户带来了诸多麻烦。 幸运的是&#xff0c;蛙色Web3D编辑器作为一款领先的在线编辑工具&#xff0c;通过全面…

Sentieon | 每周文献-Epidemiology-第五期

流行病学系列文章-1 标题&#xff08;英文&#xff09;&#xff1a;Rare Variants in Inborn Errors of Immunity Genes Associated With Covid-19 Severity标题&#xff08;中文)&#xff1a;与Covid-19严重程度相关的免疫基因先天性缺陷的罕见变异发表期刊&#xff1a;《Fron…

背包问题学习笔记

笔记&#xff0c;不是博客&#xff0c;所以就只是粗略的写写 背包问题状态设置 1.小于等于某值&#xff0c;一般用于求在限制背包体积内的情况求解 状态设置 F(n) 表示此时的背包体积小于等于n&#xff0c;F数组初始化为0即可 例题&#xff1a;423. 采药 - AcWing题库 2.恰…

用Python采用Modbus-Tcp的方式读取485电子水尺数据

README.TXT 2023/6/15 V1.0 实现了单个点位数据通信、数据解析、数据存储 2023/6/17 V2.0 实现了多个点位数据通信、数据解析、数据存储 2023/6/19 V2.1 完善log存储&#xff0c;仅保留近3天的log记录&#xff0c;避免不必要的存储&#xff1b;限制log大小&#xff0c;2MB。架…

C#生成类库dll以及调用实例

本文讲解如何用C#语言生成类库并用winform项目进行调用 目录 创建C#类库项目 Winform调用dll 创建C#类库项目 编写代码 using System.Threading;namespace ClassLibrary1 {public class Class1{private Timer myTimer = null;//定义定时器用于触发事件//定义公共的委托和调…

HW5300V3-ISCSI存储运维,看这一篇就够了01——流程图

一、存储使用流程图 二、块存储-配置流程图

【Hippo4j源码的方式安装部署教程】

&#x1f680; 线程池管理工具-Hippo4j &#x1f680; &#x1f332; AI工具、AI绘图、AI专栏 &#x1f340; &#x1f332; 如果你想学到最前沿、最火爆的技术&#xff0c;赶快加入吧✨ &#x1f332; 作者简介&#xff1a;硕风和炜&#xff0c;CSDN-Java领域优质创作者&#…

Vue3 + Ts + Vite —— 项目封装使用交互式 彩屑纷飞 示例 (亲测可用、复制即展示)

目录 &#x1fa82; 演示 &#x1f6f9; 目录树 &#x1f414; 安装 &#x1f916; global.d.ts &#x1f637; zkConfettiCanvas.vue &#x1f30d; confetti.ts &#x1f38b; confettiIndex.ts &#x1f637; index.vue &#x1f970;&#x1f609; 谢谢观看 &…

哪款蓝牙耳机通话清楚,几款拥有通话降噪技术的骨传导耳机分享

嘿&#xff0c;你是音乐爱好者吗&#xff1f;还是热衷于锻炼身体&#xff1f;那么你一定不能错过骨传导耳机&#xff01;这种神奇的耳机通过骨头的振动来传递声音&#xff0c;绝不同于传统的耳道或鼓膜传播方式。你可保持对周围环境的警觉&#xff0c;同时避免对你的听力造成任…