坚持是一件说起来容易,做起来不容易的事情。
#标注(Annotations)也被称为注解,可以提供与程序有关的数据,它本身并不是程序的一部分,只是程序代码的标记,并不会对代码本身产生影响。在实际开发过程中,可以通过使用标注,在不改变原有逻辑的情况下,往源文件中人一些补充信息,使代码分析工具、开发工具和部署工具能通过这些补充信息进行验证或部署。
1、#标注的用法
#标注是代码里的标记,这些标记在类加载、运行或编译时可以被解析,但其本身不对程序的运行产生直接影响。
标注有很多种用法,主要包括以下几种
(1) 为编译器提供信息。编译器可以通过标注来检测错误或禁止警告
(2) 在编译和部署时,软件开发工具可以处理标注信息,并生成代码、XML文件等。
(3) 在运行时,有些标注可以被检查并使用。
标注常应用于包、类型、构造方法、方法、成员变量、参数、本地变量的声明中,此外,程序的类的声明、成员变量的声明及其他程序元素的声明也能应用到标注,标注可以包括带有名称或未命名值的元素,且通常在它所在行的第一行。
例如:
@ Author(name="王老师",date ="2022-12-12")classMyClass() {}
或者使用如下代码。
@SuppressWarnings(value = "unchecked")void myName(){}
如果是只有一个值的元素,可以省略名称。例如:
@SuppressWarnings("unchecked")void myName(){}
此外,标注也可以没有元素,这时可以省略圆括号。例如:
@Overridevoid myName(){}
2、#文档标注
#标注可以被用来代替应该出现在代码中的注释。若以传统的方式开始每个类通常要使用大量的注释来提供重要信息。
例如:
public Mouse extends Animal {作者:王老师//日期:2022-12-12当前版本:V2.0//最后修改日期:2022-12-28参与者:王老师,张老师,李老师//类体代码}
如果使用标注来添加同样的元数据信息,必须首先定义“标注类型”。例如:
@interface TaggingInfo {Sting 作者();String日期();int 当前版本()default 1;String 最后修改日期() default "N/A";// 这里使用了数组String[]参与者();}
#标注类型的定义是通过使用一个“@”字符作为关键字interface的前导字符这有点类似于接口的定义。其中“@”代表标注类型。从某个角度来说,标注类型属于接口的一种。
上面的标注体内容中对于“标注类型元素”的声明与方法的声明形式有些类似大家要注意区分和总结。此外,“标注类型元素”的声明可以定义可选的默认值顥倭一旦定义了标注类型,就可以使用该类型的标注了。例如,可以像下面这样填充值进去。
@ TaggingInfo(作者="王老师",日期="2022-12-12",当前版本=7,最后修改日期="2022-12-28",//注意使用数组符号参与者={"王老师","张老师","李老师"))public classBextendsA{//类体的代码}
如果要使在“@ TaggingInfo”中的信息出现在Javadoc 生成的文档中,则必须」芍瘳渉用“@Documented”标注注释“@interface TaggingInfo”的定义。例如:
// 导入这个包才能使用 @Documentedimport java.lang.annotalion.*;@Documented@interface Tagginglnfo {String 作者();String 日期();int当前版本()default 1;String 最后修改日期()default "N/A";//这里使用数组String[] 参与者 ();}
3、#预定义标注
@Deprecated、@Override 和 @SuppressWarnings是Java 语言规范本身在javalang包中预定义的三种标准标注类型。下面来逐一介绍这三种标准标注类型。
1.@Deprecated(不提倡标注)
在Java中,如果一个程序元素的类型或类型成员使用了@Deprecated 进行标注,那#编译器不提倡使用这个被标注的程序元素。如果在代码中通过继承或覆盖的方式使用了这个过时的类型或成员,那即使继承或覆盖后的类型或成员没有声明为@Deprecated,编译器仍然会报警。这证明了@Deprecated 具有一定的延续性。
当带有@Deprecated标注的方法、类或成员变量被某个程序使用时,编译器会顥倜成一个警告信息。如果在实际开发过程中使用了一个不提倡使用的元素,可以通过Javadoc的@deprecated标签将其收入文档中。
例如:
//Javadoc 注释/*** @deprecated*解释为什么反对它*/@Deprecatedstatic void deprecatedMethod(){} //被反对的方法声明
在Javadoc注释和在标注中使用的“@”符号仅仅在概念上有所相关,实际二者并不相同。一个简单的区分方法是,以一个小写字母“d”开头的是Javadoc 标签,以一个大写字母“D”开头的是标注。
例如:
public interface House {/***@deprecated*提倡首选 openFrontDoor()或openBackDoor()方法,不提倡用 open() 方法@Deprecatedpublic void open();public void openFrontDoor();public void openBackDoor();}
在上面的接口中,不提倡使用 open()方法,而提倡使用更明确的openFroetDoor()万法或 openBackDoor()方法。
#因为根据标注信息,如果在程序中使用了open()方法编译器会生成一个警告信息。如下:
public class BigHouse implements House {public void open() {}public void openFrontDoor() {}public void openBackDoor() {}}
如果编译并运行以上程序,会出现如下警告,
注意:BigHouse.java 使用或覆盖了已过时的 API.注意:要了解详细信息,请使用-Xlint:deprecation 重新编译.
如果不希望编译时出现这样的警告,可以使用如下方法。
public class SmallHouse implements House {//从house接口中继承文档注释标签@Deprecatedpublic void open(){}public void openFrontDoor(){}public void openBackDoor(){}}
如果在编译以上程序时,用@Deprecated标注了open()方法的实现處专编译器就不会出现警告信息了。
2.@Override(重载标注)
如果想让一个元素重载其基类中声明的元素,可以使用“@Override”标注它能起到断言的作用,向编译器说明程序是通过被标注的方法重载了基类的方法。例如:
//标注要被覆盖的基类的方法@OverrideintoverriddenMethod(){}
在实际开发过程中,当使用了@Override标注的派生类方法不能正确覆盖其基类方法时,编译器会生成并提示一个错误。
例如:
interface Closable {voidclose();}class File implements Closable {@Overridepublicvoidclose(){// 关闭文件}}
程序在编辑File类时,由于它并没有覆盖Closable.close 方法,而是实现了口中的 close()方法,所以编译器会生成一个错误信息。
这时@Override 标注就会发挥作用,因为它经常在一个类试图覆盖其基类方法但又写错了方法名时产生作用。
3.@SuppressWarnings(禁止警告标注)
如果想要有选择地关闭编译器对类、方法、成员变量或变量初始化的警告,可以通过@SuppressWarnings禁止警告标注来实现。
例如,一个类在没有提供其类型时使用了一个泛型集合类(generic colection类),那编译器将发出“uncheckedwarning”的警告。
这种情况发生时,通常需要对引起警告的代码进行查找。如果查找到的警告表示的是错误信息,那就要对其进行纠正。
程序在使用必须跟非泛型的旧代码交互的泛型集合类时出现了“uncheckedwarning”警告时,可通过在调用的方法前增加 @SuppressWarnings 标注进行修饰让编译器停止对此方法的警告。
在SuppressWarnings中有一个类型为String[]的成员,它的值为被禁止的警告名,对javac编译器来说,对-Xlint选项有效的警告也同样会对@SuppressWarings有效编译器会忽略无法识别的警告名。
因此,可以在不想出现某些警告时通过使用道@SuppressWarnings”标注“告诉”编译器。例如:
//告诉编译器不要对这个不提倡使用的方法生成警告SuppressWarnings("deprecation")void useDeprecatedMethod(){//阻止不提倡使用的信息objectOne.deprecatedMethod();}
我们知道,在前面的House接口的声明中使用不提倡使用的@Deprecated 标注open()方法的话,会导致编译器在编译House接口的实现类SmallHouse中出现警告提示信息。
如果要阻止程序在编译时出现警告提示信息,除了可以使用@Deprecatedopen()方法的实现之外,还可以使用“@SuppressWarnings("deprecation")”标注。
例如:
public class CountryHouse implements House {@SuppressWarnings("deprecation")public void open(){}public void openFrontDoor(){}public void openBackDoor() {}}
编译器的警告信息在 Java 语言规范中分为“不提倡的”和“未检査的”两类,上述代码中展示的是“不提倡的”编译器警告,而在编写的代码中出现连接泛型时会出现“未检查的”警告。如果我们在实际开发过程中需要阻止超过一种类型的警告,
可以使用如下语法。
@SuppressWarnings({"unchecked","deprecation"})4、标注处理
#程序员自己编写一个“标注处理器”是标注中的一种更高级的处理方法。例如,生成辅助代码、帮助程序员按照预定义的模式创建模板代码等。在JDK中有一个名为“apt”的标注处理工具,它也是Java编译器的标准组成部分。
要使标注信息在运行时可用,其本身必须有一个“@Retention(RetentionPolicy.RUNTIME)”标注。
例如:
import java.lang.annotation.*;@Retention(RetentionPolicy.RUNTIME)@interface AnnotationForRuntime {//为运行时处理提供信息的元素}

(从基础背景开始学起,坚持,是一件不容易的事情。)

文章推荐
AI基础学习第二阶段笔记:从0开始学Java“搭建Java程序开发环境”
AI基础学习第二阶段笔记:从0开始学Java“开发第一个Java应用程序”
请在微信客户端打开
文 | Lisa Notes
Lisa Notes |一个Lisa’s notes:生活、工作、学习中那些事儿,感悟自我成长,随心随笔杂谈。微信搜索「Lisa Notes」(ID:Lisa-notes),查看更多信息,原创小说,PPT干货分享。

长按♥一键关注
特别声明
本文为自媒体、作者等在微信公众号上传并发布,仅代表作者观点,不代表微信公众号的观点或立场,微信公众号仅提供信息发布平台,最终解释权归本人所有。合作请联系13698281600@163.com。
全世界只有不到0.03%的人
关注小SA
你真是个特别的人
快戳我!快戳我!快戳我!㊋㊋㊋