注解
注解(也被称为元数据)为我们在代码中添加信息提供了一种形式化的方法。使我们可以在稍后某个时刻很方便地使用这些数据。
注解在一定程度上是把元数据与源代码文件结合在一起的,而不是保存在外部文档中。注解使得我们能够以由编译器来测试和验证的格式,存储有关程序的额外信息。
定义注解
@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
public @interface Test {
public void Metho();//成员变量,没有参数,没有异常
}
我们可以看到,如果忽略interface前面的那个@,@Test的定义很像一个空的接口。定义注解时,会需要一些原注解,如@Target用来定义你的注解应该用于什么地方(例如是一个方法或者一个域)@Retention用来定义该注解在哪一个级别可用,在源代码中(SOURCE)、类文件中(CLASS)或者运行时(RUNTIME)。
在注解中,一般都会包含一些元素以表示某些值。当分析处理注解时,程序或者工具可以利用这些值。注解的元素看起来和接口中的方法差不多,唯一的区别就是你可以为它指定默认值。没有元素的注解被称为标记注解
注解的元素在使用时表现为名-值对的形式,并需要置于注解@…声明之后的括号里
注解的分类
按照运行机制分
- 源码注解
- 编译时注解
- 运行时注解‘
按照来源分
- 来自JDK的注解
- 来自第三方的注解
- 自定义注解
元注解:注解的注解
四种元注解
* @Target—作用域(类,方法,局部变量,包,字段(成员变量)等等 )
* @Retention—-生命周期(源代码上,编译时,运行时)
* @Documented—-生成javadoc时会包含注解
* @Inherited—-允许继承子类(只能作用于类,但不能作用于接口)
注解元素
注解元素的可用类型为:
* 9种基本数据类型
* String
* Class
* enum
* Annotation(注解)
* 以上类型的数组
另外声明一点,注解是可以嵌套的,而且当注解只有一个元素时,元素的名称只能为value
默认值限制
* 元素不能有不确定的值,也就是说,元素必须要么具有默认值,要么在使用注解时提供元素的值。
* 对于非基本数据类型的注解,无论是在源代码中声明时,或是在注解接口中定义默认值时,都不能以null作为其值
注解不支持继承
不能使用extends关键字来继承某个@interface,在这种情况下,我们可以选择嵌套的方式达到继承的目的。
解析注解的步骤
* 使用类加载器来加载类
* 找到类上面的注解
* 拿到注解实例