注解 也被成为元数据,为我们在代码中添加信息提供了一种形式化的方法,使我们可以在稍后某个时刻非常方便地使用这些数据。
注解可以提供用来完整地描述程序所需的信息,而这些信息是无法用Java来表达的。
定义在 java.lang
中的注解:
-
@Override
:表示当前的方法定义将覆盖超类中的方法; -
@Deprecated
:如果程序员使用了注解为它的元素,那么编译器会发出警告信息; -
@SuppressWarnings
:关闭不当的编译器警告信息。
1.基本语法
public class Testable {
public void execute() {
System.out.println("Executing...");
}
@Test void testExecute() {
execute();
}
}
被注解的方法与其他的方法没有区别。
1.1 定义注解
定义@Test
注解
@Target(ElementType.Method)
@Retentation(RetentationPolicy.RUNTIME)
public @interface Test{}
注解的元素看起来就像接口的方法,唯一的区别是你可以为其指定默认值。没有元素的注解称为 标记注解(marker annotation)。
1.2 元注解
元注解负责注解其他的注解
元注解 | 说明 |
---|---|
@Target | 表示该注解可以用于什么地方。可能的 ElementType 参数包括:CONSTRUCTOR(构造器的声明),FIELD(域声明),LOCAL_VARIABLE(局部变量声明),METHOD(方法声明),PACKAGE(包声明),PARAMETER(参数声明),TYPE(类,接口或enum 声明)。 |
@Retention | 表示需要在什么级别保存该注解信息。可选的Retention参数包括:SOURCE,CLASS,RUNTIME |
@Documented | 将此注解包含到Javadoc中 |
@Inherited | 允许子类继承父类中的注解 |
2.编写注解处理器
如果没有用来读取注解的工具,那注解也不会比注释更有用。使用注解的过程中,很重要的一部分就是创建与使用 注解处理器。
编译其对元素的默认值有些过分挑剔。首先,元素不能有不确定的值。也就是说元素必须要么具有默认值,要么在使用注解的时候提供元素的值。其次,对于非基本类型的元素。这个约束使得处理器很难表现一个元素的存在或缺失的状态,因为在每个注解的声明中,所有的元素都存在,并且都具有相应的值。为了绕开这个约束,我们只能定义一些特殊的值,例如空字符串或负值。
不能使用 extends
来继承某个@interface
。
09/06/2019 :created