一、简介
【概述】
不是程序本身,不能改变程序的运行结果,也不会影响程序运行的性能。可以对程序作出解释,但是区别于注释,注解可以写入参数,通过反射机制来获取所注解信息的访问。
【分类】
根据注解是否包含成员变量,可以分为如下两类。
分类 |
说明 |
标记注解 |
没有定义成员变量,这种注解仅利用自身的存在与否来提供信息 |
元数据注解 |
包含成员变量,因为可以接受更多的元数据,所以也被称为元数据注解。 |
【常见注解】
注解 |
作用域 |
说明 |
@Override |
方法 |
指定方法重写,只能修饰方法。 |
@Deprecated |
类、接口、成员方法和成员变量 |
表示某个元素(类、方法等)已过时 |
@SuppressWarnings |
类、接口、成员方法 |
取消显示指定的编译器警告 |
@SafeVarargs |
可变参数方法 |
抑制编译器警告 |
@FunctionalInterface |
接口 |
指定某个接口必须是函数式接口 |
二、元注解
用于解释其他注解,自定义注解时可使用元注解。
1、@Documented
【概述】
标记注解,该注解修饰的注解类会被JavaDoc工具提取成文档。
【示例】
编写注解和测试类
@Documented @Target({ ElementType.TYPE, ElementType.METHOD }) public @interface FxDocumented { String name() default "这是@Documented注解"; }
@FxDocumented(name = "fuxing") public class FuXing { /** * 测试document */ @FxDocumented(name = "fuxing") public String Test() { return "CodeUpHub测试@Documented"; } }
打开Java文件所在的目录,分别输入如下两条命令行:
javac FuXing.java FxDocumented.java javadoc -d doc FuXing.java FxDocumented.java
运行成功后,打开生成的帮助文档,如下图
2、@Target
【概述】
用来指定一个注解的使用范围,即被@Target修饰的注解可以用在什么地方。该注解有一个成员变量(value)用来设置适用目标。
【作用域常量】
枚举 |
说明 |
CONSTRUCTOR |
用于构造方法 |
FIELD |
用于成员变量(包括枚举常量) |
LOCAL_VARIABLE |
用于局部变量 |
METHOD |
用于方法 |
PACKAGE |
用于包 |
PARAMETER |
用于类型参数(JDK 1.8新增) |
TYPE |
用于类、接口(包括注解类型)或enum声明 |
【示例】
@Documented @Target({ ElementType.TYPE, ElementType.METHOD }) //表明该注解作用于类和方法 public @interface FxDocumented { String name() default "这是@Documented注解"; }
3、@Retention
【概述】
用于描述注解的生命周期,也就是该注解被保留的时间长短。该注解中的成员变量(value)用来设置作用在哪个时期。
【作用域常量】
生命周期大小排序为 SOURCE < CLASS < RUNTIME
枚举 |
说明 |
SOURCE |
源码有效 |
CLASS |
CLASS类有效 |
RUNTIME |
运行时有效 |
4、@Inherited
【概述】
标记注解,用来指定该注解可以被继承。使用该注解的Class类,表示这个注解可以被用于该Class类的子类。就是说如果某个类使用了被@Inherited修饰的注解,则其子类将自动具有该注解。
三、自定义注解
【流程】
创建注解类Annotation;
定义成员变量(以方法的形式来定义);
可以使用default为成员变量指定初始值;
【示例】
@Target({METHOD}) @Inherited @Retention(RUNTIME) public @interface FuXing { String name() default "FuXing"; }