为什么Java要用注解,那么这些注解有哪些作用呢
注解的英文名叫Annotation,是Java中给类、方法以及成员变量等元素增加元数据的方式。换言之注解就是用于描述这些元素的。
元数据一词从单词metadata译来,意为描述数据的数据。
注解和注释不同的是,注解会被Java编译器处理而非跳过。
注解是在JDK5。0版本开始引入的,它可以在编译期使用预编译工具进行处理,也可以在运行期使用Java反射机制进行处理。注释可以用于创建Javadoc,跟踪代码中的依赖性,甚至执行基本编译时检查。本质上,Annotion是一种特殊的接口,程序可以通过反射来获取指定程序元素的Annotion对象,通过Annotion对象来获取注解里面的元数据。
相比上来就给大家介绍注解的各种概念,它都有哪些作用外,我更希望把自己带入到一个Java小白的身份从零开始了解注解。我们通过认识注解、使用注解开始了解注解,随后带出Java原生自带的注解以及如何自定义注解,在编写自定义注解的时候顺便通过使用元注解把元注解的概念介绍一下,最后再来说注解都有哪些作用,以及使用注解带来的收益时需要付出什么代价。
本文内容大纲如下:
初识注解
Java注解的简写形式如下:Entity复制代码
符号告诉编译器这是一个注解,字符后面的名称是注解的名称。在上面的示例中,注解名称是Entity。
注解还可以包含为其设置值的元素,类似注解的一个属性。下面是一个带元素的PostMapping注解示例。PostMapping(path)复制代码
上面的PostMapping注解包含一个名为path的元素,我们为其赋值为。设置元素值的语法是在注解名称后的括号内进行设置。
一个注解可以包含多个元素,比如PostMapping注解就可以通过consumes元素,指定接收的请求体的格式为applicationjsonPostMapping(path,consumesMediaType。APPLICATIONJSONVALUE)复制代码
当然,PostMapping注解能设置哪些元素的值,也是根据PostMapping注解的定义来的。publicinterfacePostMapping{省略其他元素的定义。。。。。。AliasFor(annotationRequestMapping。class)String〔〕path()default{};AliasFor(annotationRequestMapping。class)String〔〕consumes()default{};。。。。。。}复制代码
如果注解只包含一个元素,那么按照约定惯例,会把该元素命名成value:InsertNew(valueyes)复制代码
当注解只包含一个名为value的元素时,使用注解时我们可以省略元素名称,只提供元素值。InsertNew(yes)复制代码使用注解
Java的注解可以应用在类、接口、方法、方法的参数、成员变量和方法内的局部变量之上,比如在类上应用注解,就是把注解放在类声明之上。EntityTable(namecoffees)publicclassCoffeeimplementsSerializable{。。。。。。}复制代码
下面这个例子在类、成员变量、成员方法、方法参数上都应用了注解。RestControllerRequestMapping(order)Slf4jpublicclassCoffeeOrderController{AutowiredprivateCoffeeOrderServiceorderService;AutowiredprivateCoffeeServicecoffeeService;创建Coffee订单paramnewOrderreturnCoffeeOrderPostMapping(path,consumesMediaType。APPLICATIONJSONVALUE)publicCoffeeOrdercreate(RequestBodyNewOrderRequestnewOrder){。。。}}复制代码
上面是一个典型的SpringMVC的ControllerAPI处理方法,如果你对Spring框架还不太熟悉,可以先不管这些注解什么意思,这里主要是演示一下注解可以用在哪里。在Java程序的这些成员上都可以加上注解,为成员添加元数据。Java内置的注解
Java带有三个内置注解,可以直接被编译器处理,用于为Java编译器提供指令。这些注解是:OverrideDeprecatedSupressWarningOverride
Override注解用于标注方法,它说明了被标注的方法重载了父类的方法,起到了断言的作用。如果我们在一个没有覆盖父类方法的方法上应用Override注解时,Java编译器会告警。publicclassMySuperClass{publicvoiddoTheThing(){System。out。println(Dothething);}}publicclassMySubClassextendsMySuperClass{OverridepublicvoiddoTheThing(){System。out。println(Doitdifferently);}}复制代码
在覆盖了父类方法的子类方法上使用Override注解并不是必需的。不过,使用了Override注解的方法,编译器在编译时会去父类找相同的方法签名,验证方法覆盖是否真实存在。
使用Override注解的一个好处是比如说有人在项目里修改了父类的被子类覆盖的方法,子类覆盖方法上不使用Override注解的话编译器是不会提示出子类方法未覆盖父类方法的,可能会导致调用方无法正确调用到子类方法的问题,这时就显出Override的重要性了。Deprecated
Deprecated注解用于将类、方法或字段标记为已弃用,这意味着不推荐再使用它。如果你的代码使用了不推荐使用的类、方法或字段,编译器在编译时会产生一条Warning级别的告警。DeprecatedpublicclassMyComponent{}复制代码
在类声明上方使用Deprecated注解将该类标记为已弃用。还可以在方法和字段声明上方使用Deprecated注解,将方法或字段标记为已弃用。当使用Deprecated注解时,最好也使用相应的deprecated注解,该注解用于JavaDoc,一般使用它来解释为什么不推荐使用以及应该改用什么。DeprecateddeprecatedUseMyNewComponentinstead。publicclassMyComponent{DeperecateddeprecatedUseMyNewComponentsprintComponentNameinstead。publicvoidprintComponentName(){System。out。println(MyComponent)}}复制代码SupressWarning
SuppressWarnings用于关闭对类、方法、成员编译时产生的特定警告。SuppressWarnings不是一个标记注解。它有一个类型为String〔〕的数组成员,这个数组中存储的是要关闭的告警类型。对于javac编译器来讲,对Xlint选项有效的警告名也同样对SuppressWarings有效,同时编译器会忽略掉无法识别的警告名。SuppressWarnings({rawtypes,unchecked})publicclassSuppressWarningsAnnotationDemo{staticclassSuppressDemoT{privateTvalue;publicTgetValue(){returnthis。value;}publicvoidsetValue(Tvar){this。valuevar;}}SuppressWarnings({deprecation})publicstaticvoidmain(String〔〕args){SuppressDemodnewSuppressDemo();d。setValue(London);System。out。println(Place:d。getValue());}}复制代码自定义注解
下面让我们自己定义一个注解。publicinterfaceMyAnnotation{Stringvalue();Stringname();intage();String〔〕newNames();}复制代码
使用interface关键字来声明一个注解,注解的声明有点类似于接口声明,其中的每一个方法实际上是声明了一个注解的元素。方法的名称就是元素的名称,返回值类型就是元素的值类型(返回值类型只能是基本类型、Class、String、enum)。这个例子定义了一个名为MyAnnotation的注解,它有四个元素。MyAnnotation(value123,nameJacob,age37,newNames{Jenkov,Peterson})publicclassMyClass{。。。}复制代码
现在使用MyAnnotation必须像上面这个例程中的这样,为其的所有元素指定值。但其实是可以在声明注解时给元素设置默认值的。注解元素的默认值
在定义注解的时候可以为元素指定默认值。这样元素就变成了可选的,在使用的时候被省略则直接使用其默认值。下面是在注解定义里如何给元素指定默认值的例子:interfaceMyAnnotation{Stringvalue()default;Stringname();intage();String〔〕newNames();}复制代码
现在我们可以在使用MyAnnotation注解时选择省略value元素,这样注解会默认使用value元素的默认值。如下所示:MyAnnotation(nameJakob,age37,newNames{Jenkov,Peterson})publicclassMyClass{}复制代码
像上面这个例子,在注解的使用中我们并没有指定其value元素的值。元注解
元注解是用于修饰注解的注解,在注解的定义中使用,例如:Target(ElementType。METHOD)Retention(RetentionPolicy。SOURCE)publicinterfaceOverride{}复制代码
这是Override注解的定义,可以看到其中的Target,Retention两个注解就是元注解,元注解一般用于指定注解的生命周期以及作用目标等信息。Java中有以下几个元注解:Retention:注解的生命周期或者叫保留策略Target:注解的作用目标Inherited:是否允许子类继承该注解Documented:注解是否应当被包含在JavaDoc文档中Retention
我们可以为上面自定义的注解MyAnnotation指定它是否在运行时可用,以便能通过反射进行检查。通过在注解MyAnnotation的定义中使用Retention元注解来做到这一点。importjava。lang。annotation。Retention;importjava。lang。annotation。RetentionPolicy;Retention(RetentionPolicy。RUNTIME)interfaceMyAnnotation{Stringvalue()default;}复制代码
添加到MyAnnotation定义上的元注解。Retention(RetentionPolicy。RUNTIME)复制代码
会指示Java编译器和JVM当前注解在运行时可以通过反射获取到。RetentionPolicy类表示注解的保留策略,包含三个两个可以使用的值:RetentionPolicy。RUNTIME表示注解永久保存,在运行时可以通过反射获取。RetentionPolicy。CLASS表示注解存储在。class文件中,在类加载阶段被丢弃,运行时不可用。RetentionPolicy。SOURCE表示注解仅在源代码中可用,在。class文件和运行时中不可用。
在定义注解时如果不指定注解的任何保留策略,RetentionPolicy。CLASS就是默认的保留策略。如果创建的注解是与扫描代码的构建工具一起使用,则可以使用保留策略RetentionPolicy。SOURCE,这样就会避免。class文件受到不必要的污染。Target
上面例子第一的MyAnnotation注解并没有标明该注解的作用目标,是能作用在类上,方法上,还是字段上。如果要限制注解的可作用目标的话,就需要在注解定义中使用Target元注解来进行限制。
下面我们给自己定义的MyAnnotation加上Target,限制它只能注解方法上。importjava。lang。annotation。ElementType;importjava。lang。annotation。Target;Target({ElementType。METHOD})publicinterfaceMyAnnotation{Stringvalue();}复制代码
ElementType包含以下可用的枚举值:ElementType。TYPE:允许被修饰的注解作用在类、接口和枚举上ElementType。FIELD:允许作用在属性字段上ElementType。METHOD:允许作用在方法上ElementType。PARAMETER:允许作用在方法参数上ElementType。CONSTRUCTOR:允许作用在构造器上ElementType。LOCALVARIABLE:允许作用在本地局部变量上ElementType。ANNOTATIONTYPE:允许作用在注解上ElementType。PACKAGE:允许作用在包上
大部分枚举值的名称都是自解释的,可以通过字面单词意思看出来。有两个需要额外说明下,ElementType。ANNOTATIONTYPE表示注解只能用于注解其他注解。在Target和Retention这些元注解的定义里我们能看到使用的正式这个枚举值。DocumentedRetention(RetentionPolicy。RUNTIME)Target(ElementType。ANNOTATIONTYPE)publicinterfaceTarget{ElementType〔〕value();}复制代码
ElementType。TYPE表示注解能用于任何类型,可以是类、接口、枚举,包括注解。Inherited
Inherited表示自动继承注解类型。如果注解声明中存在Inherited元注解,则注解所修饰类的所有子类都将会继承此注解。java。lang。annotation。InheritedInheritedpublicinterfaceMyAnnotation{}MyAnnotationpublicclassMySuperClass{。。。}publicclassMySubClassextendsMySuperClass{。。。}复制代码
在这个例子中,MySubClass会从父类MySuperClass自动继承MyAnnotation注解。Documented
Documented元注解被用于告知JavaDoc生成工具,当前注解需要在使用它的类的文档中显示。importjava。lang。annotation。Documented;DocumentedpublicinterfaceMyAnnotation{}复制代码MyAnnotationpublicclassMySuperClass{。。。}复制代码
当为MySuperClass生成JavaDoc的时候,MyAnnotation注解会被包含其中。Documented这个元注解并不会经常用到,当我们看源码的时候遇到它后,能知道它是干什么用的就行了。Java里注解的用途
在Java里注解有许多用途,可以归纳为三类:编译检查:通过代码里标识的元数据让编译器能实现基本的编译检查,编译器可以使用注解来检测错误或抑制警告。编译时和部署时的处理:程序可以处理注解信息以生成代码,XML文件等。运行时处理:可以在运行时检查某些注解并处理。
作为Java程序员,尤其是编程十几年年的老手,多多少少都曾经历过被各种配置文件(xml、properties)支配的恐惧。过多的配置文件会使得项目难以维护。使用注解可以减少配置文件或代码,是注解最大的用处,现在Spring家族的SpringBoot就是靠注解维护各种Bean组件的,让开发中者不再用XML指定各种JavaBean的路径、名称等属性,减少了不少项目配置的步骤,从而让Java项目的开发提速了不少。
原文:https:juejin。cnpost7164655191201939486
妊娠纹如何去除?激光去妊娠纹的副作用妊娠纹是每个产后妈妈们会遇到的问题,激光治疗妊娠纹越早恢复越好,有没有什么副作用呢?一起来了解下。激光去妊娠纹原理激光去妊娠纹,不麻醉开刀,也不需药物刺激,而是运用……
美甲图片2017新款式钻亮晶晶的带钻美甲精致感立显【美甲图片2017新款式钻】看惯的了简单美甲图片,是否想换点不一样的视觉美,那就选一款带钻的美甲吧,带钻的美甲太俗气?NO、NO,选对适合你的美甲款,亮晶晶的带钻美甲精致感立显……
玻璃甲怎么做图解简单有范的玻璃甲教程图解玻璃甲怎么做图解?玻璃碎指甲如何做步骤你造么?现在在美甲界非常流行玻璃风格的美甲。玻璃甲是2016年美甲款式中正当红的款式,今天为大家带来一款简单一些的玻璃甲做法。这样的美甲看……
酒窝也能造?做酒窝再造术前你须知道的事项爱美的朋友希望通过酒窝再造术来获得两个美丽可爱的酒窝,但在做手术前,你或应了解多些酒窝再造术的内容。酒窝再造术酒窝再造术又称酒窝成形术,是指通过缝扎、切开、导入等手……
大正观点幼儿园设计到底要注意什么?在瑞吉欧教育体系中,教育空间是孩子的第三位老师,也就是说空间的设置对孩子的行为会产生潜移默化的影响,因此需要非常关注注意幼儿园空间的设计。那么,幼儿园设计的灵魂到底是什么?……
少女清新妆容画法这个夏天怎能没有清新脱俗花仙子妆容夏季炎热天气,整个人都清爽不起来,什么都不想动。其实如果画一个仙儿仙儿的妆容,让美妞瞬间置身在云雾缭绕的仙境是不是感觉清凉许多,今天推荐这款妆容虽然不太日常,但仙气十足宛如花仙……
惜命的最好方式(幡然醒悟)现在有些人热衷躺平,甚至还把庄子搬出来,作为自己的论据,曰:至乐无乐,至誉无誉。直白的说法就是:如果能把外在的钱财、权利都放下,也许就会体会到真正的快乐了。既然说到……
柳叶眉回归为什么江疏影却独爱一字眉【柳叶眉回归为什么江疏影却独爱一字眉】柳叶眉回归,很多女星的眉毛都变成弯弯的柳叶眉了,江疏影却独爱一字眉,她的一字眉像是量身定做那么漂亮,但是不是每个人都适合一字眉的,眉形还得……
雾状眉怎么画?一字眉out现在流行雾状眉韩剧的风靡让韩妆在中国受到万千之宠爱,继一字眉、粗平眉ldquo;肆虐rdquo;洗礼后,现在流行雾状眉,你还在画一字眉吗?一字眉out了,今天小编就教大家雾状眉怎么画?……
几何美甲教程步骤图解简单几何美甲别致更清新【几何美甲教程步骤图解】美甲的图案多种多样,比起法式美甲,明快青春的几何美甲,似乎更招女孩子们的喜欢。别致的线条,硬朗的美感,吸睛却又不张扬,适合的场合更多,更前卫,一起来看看……
李铁和李霄鹏尴尬不?国脚随U23国足集训后感叹训练量好大根据记者马德兴的报道,5名国脚加入U23国足的训练营,让U23国足的进攻更加立体。此外,超龄国脚和U23国足进行了4堂训练课之后也私下感慨,已经很久没有进行如此大量的训练课了。……
韩式妆容画法甜而不腻的韩式奶茶妆的画法【韩式妆容画法】韩式的妆容青春、甜美且具有亲和力。最近大热的韩国丧尸片《釜山行》,郑有美这样的韩式奶茶系风格现在已经悄悄在娱乐圈中流行起来了,小编为你分享韩式妆容的画法,一起来……
别人不会告诉你的6件事人类的悲喜,并不相通你的脆弱,千万不要扒开给别人看,因为除了你自己,别人都无法感同身受。你以为别人能分担你的痛苦,实际上人家表面安慰挂在嘴边,实际上心里藏着不屑,背……
mac圣诞套盒有哪些颜色不容错过的圣诞限量礼盒mac家的口红女生应该人手一支,像什么rubywoo啊chili啊这种热门色号更是百搭,适合所有肤色的女生,今年2018款的mac圣诞套盒更是给力,集齐热门色号,而且价格也很划……
俏皮精灵妆怎么画甜美古怪精灵妆画法步骤公主童话中的精灵,天真可爱,善良友好,也不乏带点调皮的个性,但依然惹人喜爱。今天,我就来分享这款,略带俏皮feel的精灵妆。把天真活泼的童话精灵,融入我们的妆面中,希望我们每个……
吴丹红律师为劳荣枝辩护遭网暴并有人向司法部门投诉他,人性可怕作者:纳兰唐儿相逢是一首歌,无论是与人的相逢,还是与山河草木的相逢,都是一首荡气回肠,振奋人心的歌谣。世间所有相遇都是久别重逢,前世已经认识今生再见。封尘的记忆便在瞬间奔……
春天适合什么唇妆?4款简单易上手的撩动唇色唇妆是整个妆容的点睛之笔,在和煦的春日,唇妆也是花样百出,各显妩媚风情。今天小编就和小姐姐们一起分享几款春日较火得日常唇妆,给小姐姐们约会聚餐的时候都可以用的上的,简单易上手,……
国产平价好用粉底推荐测评国货的崛起在我们平时的日常生活中有很多女性朋友都会经常化妆,说到化妆很多人第一个想到的就是粉底,粉底作为化妆的第一步是很重要的,那么下面就由5号网的小编来为大家介绍国产平价好用粉底推荐测……
蓝色系美甲图片2019仙气满满蓝色系美甲谁也不能拒绝蓝色的美,虽然在冬季谈蓝色会觉得凉,但是蓝色带给人仙气满满的感觉以及深藏的智慧之意让人无法抵抗它的魅力,小编就来分享几款蓝色系美甲,让大家沾沾仙气。蓝色系美甲图片2……
少女妆怎么画少女妆容画法化妆是很神奇的一件事情,化妆能很大程度的改变我们的外在容貌,妆容的风格也会给人带来不一样的风格气质,少女妆非常的日常,清纯可爱,那么少女妆怎么画?少女妆容画法。少女妆怎么画……
热天怎么化妆不脱妆原来竟不能涂精华一进入到七月,几天阴雨绵绵,又几天艳阳高照,不同变幻的天气让我们的妆容都跟着花的差不多了,而想要在这种时候不脱妆,不下点功夫是不可能的了,下面5号网小编带大家来看一下热天怎么化……
溧阳私藏的山水秘境,超小众却高颜值的大溪水库,露营的绝佳去处到常州溧阳,相信大多数人都走过1号公路,溧阳1号公路是一条把溧阳众多美丽乡村、自然村、旅游景点等串联在一起的风景道,有着江苏最美公路的美誉,是溧阳旅游产品的颜值担当,吸引了诸多……
湖北唯一!宜昌上榜!9月24日国家体育总局、文化和旅游部联合发布2022年国庆假期体育旅游精品线路宜昌户外体育旅游线路成功入选为湖北唯一据悉,宜昌户外体育旅游线路……
油性皮肤用什么隔离霜比较好这种成分千万别碰隔离霜是个玄学,有的人说隔离霜可以防雾霾、防电子产品辐射,有的人却说隔离霜根本没有那么多功能,完全没有必要。隔离霜的种类日益繁多,功能也让人眼花缭乱,下面5号网小编带大家来看一……