Java注解
Java注解(Annotation)
注解是元数据的一种(元数据:metadata 即描述数据的数据),也称为标注,是java5中引入的一种注释机制。在框架中会大量使用。
注解类似于标签,可以在Java语言中的类、方法、变量、参数和包等上进行标注。Java注解可以通过反射获取标注内容。在编译器生成类文件时,标注可以被嵌入到字节码中。Java虚拟机可以保留标注内容,在运行时可以获取到标注内容。 当然它也支持自定义Java注解。
所有的注解都是java.lang.annotation.Annotation的子接口,所以注解也是一种特殊的接口。
例如:
红箭头标注的都是注解
内置注解
五个基本注解:
| 注解 | 说明 |
|---|---|
| @Override | 覆盖父类的方法 |
| @Deprecated | 用于标注过时的类、方法、成员 |
| @SuppressWarning | 阻止警告 |
| @FunctionaInterface | 指定接口必须为函数式接口 |
| @SafeVarargs | 一直"堆污染警告" |
四种元注解: 可以标注在注解上的注解:
- @Retetion 保留期能设定注解的存活时期
保存时期的值封装在RetentionPolicy枚举类中:
注意:一般自定义的注解使用RUNNTIME
RetentionPolicy.SOURCE:注解只能存在原文件中,编译之后字节码文件中没有。
RetentionPolicy.CLASS:注解可以存在源文件和字节码中,一旦加载进JVM,JVM中不存在。 RetentionPolicy.RUNNTIME: 注解可以存在于文件中、字节、JVM中。
- @Decumented
注解中的元素包含javadoc中
- @Target
限定注解可以使用的地方
- @Inherited
标明注解可被继承,即子类可以继父类的注解。
自定义注解
Java通过关键字@interface自定义注解,注解也可以被其他注解修饰(元注解)。注解和接口类似,内部可以定义常量和方法。
注解定义方法有一些限制:方法不能有参数,返回值只能是基本类型及基本类型的数组。
自定义注解例:
@Target(ElementType.TYPE) //只能修饰类、接口、枚举
@Retention(RetentionPolicy.RUNTIME) //注解保存的范围
@Inherited //可被继承
@Documented //写入javadoc
public @interface Msg {
String DEFAULT_MSG = "msg";
String msg() default DEFAULT_MSG; //默认值
}
使用自定义注解:
@Msg(msg = "Test")
public class Test {
}
获取注解内容:
public class Main {
public static void main(String[] args) {
Test test = new Test();
Class tClass = test.getClass();
Msg msg = (Msg) tClass.getAnnotation(Msg.class);
System.out.println(msg.msg());
}
}