注解有以下几个作用:
-
编写文档
-
代码分析
-
编译检查
内置注解
java中常用的内置注解有:
-
@Override 重写方法
-
@Deprecated 标注内容已过时
-
@SuppressWarnings("all") 压制所有警告⚠
自定义注解
注解继承自Annotation接口
创建指定以注解格式如下:
@Target({ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
public @interface AnnoTest {
String name();
}
注解需要以方法的形式定义自己的成员属性。使用时需要对成员进行赋值。
例如
@AnnoTest(name = "bob")
class Test{}
同时对方法的返回值也有要求,返回值类型只能够时以下几种:
- 基本类型
- String
- 枚举
- 注解
- 以上类型的数组
注解中被声明了的实例成员在使用注解时必须提供值,除非使用如下格式定义了初始值
public @interface AnnoTest{
String name();
int age() default 18;
}
此时,age将不是必须的,默认为18.
数组赋值时,需要使用{}来包裹,如果数组中只有一个指,则{}可以省略
元注解
常见元注解以以下几个
Target
@Target 描述注解能够作用的位置,需要一个枚举值参数列表
ElementType枚举取值:
- TYPE 作用于类
- METHOD 作用于方法
- FIELD 作用于成员变量
Retention
@Retention 描述注解能够被保留到何时,需要枚举值参数
RetentionPolicy.RUNTIME
当前被描述的注解会保留到字节码文件中,并被JVM读到
大多数时候都期望注解保留到这个阶段
Documented
@Documented 注解是否被抽取到文档中
Inherited
@Inherited 类中的注解是否能被其他类继承
解析注解
解析注解有如下一个步骤:
- 获取该类的字节码对象
- 使用getAnnotation
- 调用注解的方法
@Target({ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
public @interface AnnoTest {
String name();
}
@AnnoTest(name = "xiaoxiao")
public class Test {
public static void main(String[] args) throws NoSuchFieldException {
Class<AnnoTest> annoClass = AnnoTest.class;
Class<Test> testClass = Test.class;
AnnoTest annotation = testClass.getAnnotation(annoClass);
System.out.println(annotation.name());
}
}