Java-注解

news2024/10/7 2:20:59

文章目录

  • 前言
  • 一、概述
  • 二、元注解
    • @Target
    • @Retention
    • @Documented
    • @Inherited
  • 三、自定义注解
  • 四、常用内置注解
    • @Override
    • @Deprecated
    • @SuppressWarnings


前言

注解用于修饰包、类、方法、属性、构造器、局部变量等数据信息,它可以用于创建文档,跟踪代码的依赖性,甚至执行基本编译时检查,和注释一样,注解不影响程序逻辑,但注解可以被编译或运行,相当于嵌入式在代码中的补充信息,另外可以在编译时选择代码里的注解是否只存在于源代码级,或者它也能在 class 文件或者运行中出现。

在 Java SE 中,注解的使用目的比较简单,例如:标记过时的功能,忽略警告等。在 Java EE 中注解占据了更重要的角色,例如:用来配置应用程序的任何切面,代替 Java EE 旧版中所遗留的冗余代码和 XML 配置等。


一、概述

注解 (Annotation) 相当于一种标记,在程序中加入注解就等于为程序打上某种标记之后,javac 编译器、开发工具和其他程序可以通过反射来了解类及各种元素上有无何种标记,根据标记的不同执行对应的程序,标记可以加在包、类,属性、方法,方法参数以及局部变量上。

作用:给程序带入参数

注解是JDK1.5的新特性:

  • 注解相当一种标记,是类的组成部分,可以给类携带一些额外的信息
  • 标记 (注解) 可以加在包,类,字段,方法,方法参数以及局部变量上
  • 注解是给编译器或 JVM 看的,编译器或 JVM 可以根据注解来完成对应的功能

以下几个常用操作中都使用到了注解:

  1. 生成帮助文档:@Author@Version
    • @Author:用来标识作者姓名
    • @Version:用于标识对象的版本号,适用范围:文件、类、方法
  2. 编译检查:@Override
    • @Override:用来修饰方法声明,告诉编译器该方法是重写父类中的方法,如果父类不存在该方法,则编译失败
  3. 框架的配置 (框架=代码+配置)

二、元注解

元注解Java 官方提供的注解,用来定义注解的注解,任何官方提供的非元注解的定义都使用到了元注解。


@Target

注解类型类注解

作用:表示该注解用于什么地方,可能的值在枚举类 ElemenetType 中,包括:

枚举说明
ElemenetType.CONSTRUCTOR构造方法
ElemenetType.FIELD成员变量(包括 enum 实例)
ElemenetType.LOCAL_VARIABLE局部变量
ElemenetType.METHOD成员方法
ElemenetType.PACKAGE包声明
ElemenetType.PARAMETER方法参数
ElemenetType.TYPE类,接口(包括注解类型)或enum声明
ElemenetType.ANNOTATION_TYPE注解类
ElemenetType.TYPE_PARAMETER类型参数
ElemenetType.TYPE_USE任意类型 (不包括class)

查看 @Target 注解的定义,源码如下

package java.lang.annotation;

@Documented
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.ANNOTATION_TYPE)
public @interface Target {
    ElementType[] value();
}

枚举类 ElementTyper 的源码:

package java.lang.annotation;

public enum ElementType {
    TYPE,

    FIELD,

    METHOD,

    PARAMETER,

    CONSTRUCTOR,

    LOCAL_VARIABLE,

    ANNOTATION_TYPE,

    PACKAGE,

    TYPE_PARAMETER,

    TYPE_USE
}

@Retention

注解类型类注解

作用:用来识别注解的生命周期(有效范围),表示在什么级别保存该注解信息。可选的参数值在枚举类型 RetentionPolicy 中,包括:

枚举说明
RetentionPolicy.SOURCE注解只作用在源码阶段,生成的字节码文件中不存在
RetentionPolicy.CLASS注解作用在源码阶段,字节码文件阶段,运行阶段不存在,默认值
RetentionPolicy.RUNTIME注解作用在源码阶段,字节码文件阶段,运行阶段

查看 @Retention 注解的定义,源码如下

package java.lang.annotation;

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

枚举类 RetentionPolicy 的源码:

package java.lang.annotation;

public enum RetentionPolicy {

    SOURCE,

    CLASS,

    RUNTIME
}

@Documented

注解类型类注解

作用:将此注解包含在 javadoc 中 ,它代表着此注解会被 javadoc 工具提取成文档。在 doc 文档中的内容会因为此注解的信息内容不同而不同,相当与 @See@Param 等。

查看 @Documented 注解的定义,源码如下

package java.lang.annotation;

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

@Inherited

注解类型类注解

作用:允许子类继承父类中的注解。

查看 @Inherited 注解的定义,源码如下

package java.lang.annotation;

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

三、自定义注解

  • 注解的格式:
修饰符 @interface 注解名 {
  属性
}

@interface 这个关键字的隐含意思是继承了 java.lang.annotation.Annotation 接口

java.lang.annotation.Annotation 的源码:

package java.lang.annotation;

public interface Annotation {

    boolean equals(Object obj);
    
    int hashCode();
    
    String toString();
    
    Class<? extends Annotation> annotationType();
}

同时我们还需要根据需要,添加对应的 元注解,比如说我指向要该注解在方法上使用,就需要添加 @Target(ElementType.METHOD)

  • 属性的定义格式
格式1:
	数据类型 属性名()//没有默认值的,需要后面赋值
格式2:
	数据类型 属性名() default 默认值;   //默认值可以改变

注解中能定义什么样的属性?
1、八种基本数据类型(不能使用包装类),如:byte、char、int、short、long、double、float、boolean
2、String类型、Class类型、枚举类型、注解类型
3、以上所有类型的一维数组

  • 示例
@Target({ElementType.METHOD,ElementType.TYPE}) 
@Retention(RetentionPolicy.RUNTIME) 
public @interface Book {    
    String value();    
    double price() default 100;    
    String[] authros(); 
}

----------------------------------注意点----------------------------------

特殊属性 value

  • 如果注解中只有一个属性且名字叫 value ,则在使用该注解时可以直接给该属性赋值,而不需要给出属性名。
  • 如果注解中除了 value 属性之外还有其他属性且只要有一个属性没有默认值,则在给属性赋值时,value 属性名也不能省略了。

小结:如果注解中只有一个属性时,一般都会将该属性名命名为 value

使用注解时的注意事项

  1. 空注解可以直接使用
  2. 不同的位置可以使用一样的注解,但是同样的位置不能使用一样的注解
  3. 使用带有属性注解的时候,注解中的属性一定要赋值,如果有多个属性用 , 隔开;如果注解中的属性有数组,那么如果数组只有一个元素值,那么 { }不用写,反之需要写
  4. 如果注解中的属性值有默认值,那么我们不必要写,也不用重新赋值,反之必须写上
  5. 如果注解中只有一个属性,并且属性名叫value,那么使用注解的时候,属性名不用写

注解解析:使用 Java 技术获得注解上数据的过程则称为注解解析。

  • 注解解析的思想:
    • (1)反射带有注解的对象
    • (2)判断这对象上有没有注解
    • (3)如果有,获取这个注解
    • (4)根据获取的注解对象,再次获取属性值
  • 与注解解析相关的接口:
    • Annotation:注解类,该类是所有注解的父类
    • AnnotatedElement:该接口定义了与注解解析相关的方法
      • 常用方法:
        • T getAnnotation(Class annotationClass):根据注解类型获得对应注解对象
        • Annotation[] getAnnotations():获得当前对象上使用的所有注解,返回注解数组,包含父类继承的
        • Annotation[] getDeclaredAnnotations():获得当前对象上使用的所有注解,返回注解数组,只包含本类的
        • boolean isAnnotationPresent(Class annotationClass):判断当前对象是否使用了指定的注解,如果使用了则返回true,否则false

四、常用内置注解

@Override

定义在 java.lang.Override 中,此注解只适用于修饰方法,表示一个方法声明打算重写超类中的另一个方法声明。

查看 @Override 注解的定义,源码如下

@Target(ElementType.METHOD)
@Retention(RetentionPolicy.SOURCE)
public @interface Override {
}

我们前面学习了 元注解 ,就可以了解到该注解的一些基本信息,比如:@Target(ElementType.METHOD) 表示该注解只能标记在方法上,@Retention(RetentionPolicy.SOURCE) 注解只作用在源码阶段,生成的字节码文件中不存在,没有属性值等等。

一般子类或者实现类重写其超类的方法时,会在重写的方法上添加该注解,例如:

public class A extends B implements C {

    private void funA() {

    }

    @Override
    public void funB() {

    }

    @Override
    public void funC() {

    }
}

class B {

    public void funB() {}

}

interface C {

    void funC();
}

@Deprecated

定义在 java.lang.Deprecated 中,此注解可以用于修饰方法、属性、类。表示不鼓励程序员使用这样的元素,通常是因为它很危险或者存在更好的选择。

查看 @Deprecated 注解的定义,源码如下

@Documented
@Retention(RetentionPolicy.RUNTIME)
@Target(value={CONSTRUCTOR, FIELD, LOCAL_VARIABLE, METHOD, PACKAGE, PARAMETER, TYPE})
public @interface Deprecated {
}

通常我们可以看到某些类中会存在这种注解,表示当前类、属性或者是方法已过时,不推荐使用,比如:Date 类中的一些方法。

在这里插入图片描述


@SuppressWarnings

定义在 java.lang.SuppressWarnings 中,用来抑制编译时的警告信息,该注解需要添加指定参数才能正常使用,比如:alluncheckeddeprecation

查看 @SuppressWarnings 注解的定义,源码如下

@Target({TYPE, FIELD, METHOD, PARAMETER, CONSTRUCTOR, LOCAL_VARIABLE})
@Retention(RetentionPolicy.SOURCE)
public @interface SuppressWarnings {
    /**
     * The set of warnings that are to be suppressed by the compiler in the
     * annotated element.  Duplicate names are permitted.  The second and
     * successive occurrences of a name are ignored.  The presence of
     * unrecognized warning names is <i>not</i> an error: Compilers must
     * ignore any warning names they do not recognize.  They are, however,
     * free to emit a warning if an annotation contains an unrecognized
     * warning name.
     *
     * <p> The string {@code "unchecked"} is used to suppress
     * unchecked warnings. Compiler vendors should document the
     * additional warning names they support in conjunction with this
     * annotation type. They are encouraged to cooperate to ensure
     * that the same names work across multiple compilers.
     * @return the set of warnings to be suppressed
     */
    String[] value();
}

该注解的作用为抑制警告,根据 value 属性指定参数使用

关键字用途
all抑制所有警告
boxing抑制装箱、拆箱操作时候的警告
cast抑制映射相关的警告
dep-ann抑制启用注释的警告
deprecation抑制过期方法警告
fallthrough抑制确在switch中缺失breaks的警告
finally抑制finally模块没有返回的警告
hiding抑制相对于隐藏变量的局部变量的警告
incomplete-switch忽略没有完整的switch语句
nls忽略非nls格式的字符
null忽略对null的操作
rawtypes使用generics时忽略没有指定相应的类型
restrictionrestriction
serial忽略在serializable类中没有声明serialVersionUID变量
static-access抑制不正确的静态访问方式警告
synthetic-access抑制子类没有按最优方法访问内部类的警告
unchecked抑制没有进行类型检查操作的警告
unqualified-field-access抑制没有权限访问的域的警告
unused抑制没被使用过的代码的警告

不过最常用的还是这三种用法:

  • @SuppressWarnings("unchecked") :抑制单类型的警告
  • @SuppressWarnings("unchecked","rawtypes") : 抑制多类型的警告
  • @SuppressWarnings("all") : 抑制所有类型的警告

在很多地方都可以看到这个注解的存在,比如:ArrayList 的源码中

在这里插入图片描述

HashMap 的扩容方法中

在这里插入图片描述

作为有洁癖的开发人员,如果我们自己的写的某个类中出现了报警,但你知道它不会出错,可以添加该直接把 报黄的警报 给抑制下去。

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

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

相关文章

怎么在VMware ESXi添加NAS存储?

案例&#xff1a;需要将NAS添加到VMware ESXi “我的本地空间不是很多&#xff0c;虚拟机占了我很多空间&#xff0c;但是我有一个NAS&#xff0c;所以我想问一下有没有办法可以让VMware ESXi添加NAS存储来扩展空间&#xff1f;” 网络附加存储&#xff08;NAS&#xff09;设…

2023年6月CDGP数据治理专家认证考试,5月报名及学习

目前6月DAMA-CDGP数据治理专家认证考试开放报名地区有&#xff1a;北京、上海、广州、深圳、长沙、呼和浩特。 目前南京、济南、西安、杭州等地区还在接近开考人数中&#xff0c;打算参加6月考试的朋友们可以抓紧时间报名啦&#xff01;&#xff01;&#xff01; DAMA认证为数据…

为什么每个有影响力的内容创作者都需要一个Kadence WordPress网站

创作者经济正在蓬勃发展&#xff0c;内容创作者正在以前所未有的方式建立受众和收入来源。无论您是在 YouTube、Instagram、TikTok 还是任何其他平台上增加受众&#xff0c;充分利用这些受众变得越来越重要。 Adobe 于 2022 年 8 月发布的一项研究表明&#xff0c;过去 2 年全…

关于加强珠宝玉石类小程序把控的公告

各位小程序开发者为进一步加强小程序的规范管理&#xff0c;保障用户合法权益&#xff0c;平台将对珠宝玉石类小程序加强把控&#xff0c;具体内容如下&#xff1a; 一、 【商家自营-珠宝玉石】类目资质调整 备注&#xff1a;若小程序涉及经营随形加工的原石或摆件相关服务&…

Vue入门简介【第一篇】

大纲 一、Vue介绍 &#x1f334; 1.1 什么是Vue vue是一个构建用户界面UI的渐进式javascript框架&#xff0c;渐进式的框架是指可以一步一步的由浅入深的去使用该框架。 vue官网&#xff1a; https://cn.vuejs.org/ &#x1f334; 1.2 Vue的优点 ⭐️ 1、体积小 压缩后33…

大数据分析就业班课程大纲

大数据分析就业班课程大纲列举&#xff1a; 第一阶段 Mysql从入门到精通/Python从入门到精通课程模块课程内容 MySQL 数据库 数据库概念及其功能介绍、数据库的安装与配置、数据库表的创建及注意事项、数据库的增、删、改、查等操作、多表的关系及查询、多表的…

OSI七层模型中的MAC和PHY

最近做服务器项目在学习MAC和PHY&#xff0c;总结了一些知识点&#xff0c;拿来分享一下 说到MAC和PHY首先要提到OSI七层模型 OSI七层模型 TCP/IP四层模型 对应网络协议 应用层&#xff08;Application&#xff09; 应用层 HTTP、TFTP, FTP, NFS, WAIS、SMTP 表示层&…

【Python入门知识】NumPy 数组排序/过滤,案例+理论讲解

前言 嗨喽~大家好呀&#xff0c;这里是魔王呐 ❤ ~! 数组排序 排序是指将元素按有序顺序排列。 有序序列是拥有与元素相对应的顺序的任何序列&#xff0c;例如数字或字母、升序或降序。 NumPy ndarray 对象有一个名为 sort() 的函数&#xff0c;该函数将对指定的数组进行排…

功率放大器在Lamb波信号波包模型验证研究中的应用

实验名称&#xff1a;窄带激励条件下的兰姆波时域信号参数估计研究 研究方向&#xff1a;Lamb波 测试目的&#xff1a; 基于Lamb波的二阶频散理论&#xff0c;提出了时域信号的波包模型&#xff0c;为全文奠定理论基础。模型考虑两种情况&#xff1a;初始激励以单模态传播和…

【面试】说说什么是 Java 内存模型(JMM)?

文章目录 一、 为什么要有内存模型&#xff1f;1.1. 硬件内存架构1.2. 缓存一致性问题1.3. 处理器优化和指令重排序 二、并发编程的问题三、Java 内存模型3.1. Java 运行时内存区域与硬件内存的关系3.2. Java 线程与主内存的关系3.3. 线程间通信 四、总结 一、 为什么要有内存模…

Java阶段二Day16

Java阶段二Day16 文章目录 Java阶段二Day16SSMSpringBoot简述核心特性创建SpringBoot工程创建工程失败排查 MyBatis框架-注解管理概述MyBatis环境初始化整合MyBatisPojo对象设计Dao接口设计 SSM Spring&#xff1a;Spring是一个轻量级的容器和框架&#xff0c;为开发者提供了一…

沃通“SSL证书+代码签名证书”,防范高仿“钓鱼网站+钓鱼软件”攻击

近日&#xff0c;360发布威胁预警&#xff0c;因监测发现多起利用钓鱼网站对特定用户进行攻击的安全事件&#xff0c;呼吁警惕“高仿”软件安装程序暗藏钓鱼木马。“钓鱼网站钓鱼软件”是非常典型的钓鱼攻击组合&#xff0c;而沃通“SSL证书代码签名证书”能够帮助企业建立安全…

一文带你直观感受,BPM管理系统如何在低代码平台实现搭建

BPM系统&#xff08;英文全称&#xff1a;Business Process Management&#xff0c;翻译后简称BPM&#xff09;即业务流程管理系统&#xff0c;是指对端到端业务流程进行建模、分析和优化&#xff0c;用以实现战略业务目标&#xff0c;其特点是注重流程驱动为核心&#xff0c;实…

通过修改根证书绕过rustls的证书固定机制,抓包解密ssl流量

例子&#xff0c;cloudflare的warp-svc.exe。抓包获取密钥。 用proxifier尝试了一下强行代理&#xff0c;无效&#xff0c;因为proxifier是通过Hook Socket函数方式实现的&#xff0c;但这个程序可能没有用Socket函数进行通信。 之后发现通过nekoray基于gvisor的VPN白名单模式全…

《计算机网络——自顶向下方法》精炼——3.1-3.4.1

“生命在于运动&#xff0c;学习在于不断尝试。”——亚里士多德 文章目录 运输层概述与服务运输层功能运输层概述IP协议UDP和TCP协议 多路复用与多路分解UDPUDP相较于TCP的优点UDP报文段结构检验和可靠数据传输构造可靠数据传输协议 运输层概述与服务 运输层为应用层提供了逻…

2022年宜昌市网络搭建与应用竞赛样题(二)

网络搭建与应用竞赛样题&#xff08;二&#xff09; 技能要求 &#xff08;总分1000分&#xff09; 竞赛说明 一、竞赛内容分布 “网络搭建与应用”竞赛共分三个部分&#xff0c;其中&#xff1a; 第一部分&#xff1a;网络搭建及安全部署项目&#xff08;500分&#xff0…

传统工厂布局数字化的核心因素——智能工厂

近年来很多鼓励企业数字化转型的政策陆续出台&#xff0c;在一定程度上帮助企业减轻数字化转型的成本压力。但是企业数字化转型依然面临着诸多的问题与挑战。主要还是因为大部分企业&#xff0c;特别是制造型企业&#xff0c;数字化进程还在探索阶段&#xff0c;资金、人才、技…

接口自动化测试详解——持续集成流程中不可或缺的一环

B站首推&#xff01;2023最详细自动化测试合集&#xff0c;小白皆可掌握&#xff0c;让测试变得简单、快捷、可靠https://www.bilibili.com/video/BV1ua4y1V7Db 目录 接口自动化测试 Jenkins持续集成 总结 摘要&#xff1a; 在软件开发中&#xff0c;自动化测试已经成为了…

过滤器、拦截器、aop -> ‘三兄弟‘

目录 一、熟悉 三兄弟的区别 过滤器和拦截器的区别 使用场景 二、使用 filter Interceptor aop 一、熟悉 三个词都很熟悉&#xff0c;在某些课程或者博客中总被提到&#xff0c;但平时基本不怎么写&#xff1b; 三者在家族中的关系可以看下下边这张图&#xff0c;可以很…

52.现有移动端开源框架及其特点—PocketFlow-2

PocketFlow 性能 通过引入超参数优化组件,不仅避免了高门槛、繁琐的人工调参工作,同时也使得 PocketFlow 在各个压缩算法上全面超过了人工调参的效果。以图像分类任务为例,在 CIFAR-10 和 ImageNet 等数据集上,PocketFlow 对 ResNet 和 MobileNet 等多种 CNN 网络结构进行…