面向对象高级 注解(Annovation)
1、注解的概述
注解(Annotation)以“@注解名”在代码中存在。例如:
@Override
@Deprecated
@SuppressWarnings(value=”unchecked”)
Annotation 可以像修饰符一样被使用,用于修饰包、类、构造器、方法、成员变量、参数、局部变量的声明。还可以添加一些参数值。
这些信息被保存在 Annotation 的 “name=value” 对中。
注解可以在类编译、运行时进行加载,体现不同的功能。
2、注解与注释的不同点
- 注释(单行注释和多行注释)是给程序员看的。
- 而注解是可以被编译器或其他程序读取的。程序还可以根据注解的不同,做出相应的处理。
3、注解的重要性
一定程度上可以说:框架 = 注解 + 反射 + 设计模式。
4、常见的注解方法
(1)了解
@author 标明开发该类模块的作者,多个作者之间使用,分割
@version 标明该类模块的版本
@see 参考转向,也就是相关主题
@since 从哪个版本开始增加的
@param 对方法中某参数的说明,如果没有参数就不能写
@return 对方法返回值的说明,如果方法的返回值类型是void就不能写
@exception 对方法可能抛出的异常进行说明 ,如果方法没有用throws显式抛出的异常就不能写
(2)三个JDK内置基本注解
@Override: 限定重写父类方法,该注解只能用于方法
- 用于检测被标记的方法为有效的重写方法,如果不是(权限修饰符有误或基本数据类型不同或返回值不同),则显示编译错误!
- 只能标记在方法上。
- 它会被编译器程序读取
@Override
public String toString() {
return "Season{" +
"SEASONNAME='" + SEASONNAME + '\'' +
", SEASONTRAIT='" + SEASONTRAIT + '\'' +
'}';
@Deprecated: 用于表示所修饰的元素(类,方法等)已过时。通常是因为所修饰的结构危险或存在更好的选择,但仍然可以使用。
- 用于表示被标记的数据已经过时,不推荐使用。
- 可以用于修饰 属性、方法、构造、类、包、局部变量、参数。
- 它会被编译器程序读取。
public class AnnovationTest {
public static void main(String[] args) {
@Deprecated
Date date1 = new Date(2024-1900,11,1);
System.out.println(date1);
@SuppressWarnings("unused") String name = "Qum";
}
}
@SuppressWarnings: 抑制编译器警告。
- 抑制编译警告。当我们不希望看到警告信息的时候,可以使用 SuppressWarnings 注解来抑制警告信息
- 可以用于修饰类、属性、方法、构造、局部变量、参数
- 它会被编译器程序读取。
- 可以指定的警告类型有(了解)
- all,抑制所有警告
- unchecked,抑制与未检查的作业相关的警告
- unused,抑制与未用的程式码及停用的程式码相关的警告
- deprecation,抑制与淘汰的相关警告
- nls,抑制与非 nls 字串文字相关的警告
- null,抑制与空值分析相关的警告
- rawtypes,抑制与使用 raw 类型相关的警告
- static-access,抑制与静态存取不正确相关的警告
- static-method,抑制与可能宣告为 static 的方法相关的警告
- super,抑制与置换方法相关但不含 super 呼叫的警告
5、元注解
用于注解自定义注解的注解。
JDK1.5在java.lang.annotation包定义了4个标准的meta-annotation类型,它们被用来提供对其它 annotation类型作说明。
(1)@Target:用于描述注解的使用范围
- 可以通过枚举类型ElementType的10个常量对象来指定
- TYPE,FIELD、METHOD,CONSTRUCTOR,PARAMETER、PACKAGE.....
(2)@Retention:用于描述注解的生命周期
- 可以通过枚举类型RetentionPolicy的3个常量对象来指定
- SOURCE(源代码)、CLASS(字节码)、RUNTIME(运行时)
- 唯有RUNTIME阶段才能被反射读取到。
注解测试格式:
@Retention(RetetionPolicy.Source)
public @interface SourcePolicy{
}
(3)@Documented:表明这个注解应该被 javadoc工具记录。
(4)@Inherited:允许子类继承父类中的注解
6、自定义注解
(1)声明 (2)使用 (3)读取
【元注解】
修饰符 @interface 注解名{
【成员列表】
}
- 自定义注解可以通过四个元注解@Retention,@Target,@Inherited,@Documented,分别说明它的生命周期,使用范围,是否被继承,是否被生成到API文档中。
- Annotation 的成员在 Annotation 定义中以无参数有返回值的抽象方法的形式来声明,我们又称为配置参数。返回值类型只能是八种基本数据类型、String类型、Class类型、enum类型、Annotation类型、以上所有类型的数组
- 可以使用 default 关键字为抽象方法指定默认返回值
- 如果定义的注解含有抽象方法,那么使用时必须指定返回值,除非它有默认值。格式是“方法名 = 返回值”,如果只有一个抽象方法需要赋值,且方法名为value,可以省略“value=”,所以如果注解只有一个抽象方法成员,建议使用方法名value。