java知识点-注解
格式
元注解
public @interface 注解名称{
属性列表;
}
本质
注解本质上就是一个接口,该接口默认继承Annotation接口
public interface TestAnnotation extends java.lang.annotation.Annotation {}
可通过
编译:javac 类全路径
反编译:javap class文件
得到确认
属性
要求:
1.属性返回值类型有一下要求
* 基本数据类型
* String
* 枚举
* 注解
* 以上类型的数组
例:
import java.util.concurrent.TimeUnit;
public @interface TestAnnotation {
int value();
String value2();
TimeUnit value3();
Override value4();
int[] value5();
String[] value6();
TimeUnit[] value7();
Override[] value8();
}
2.定义属性,在使用时需要给属性赋值(属性名 = 返回值)
例:
public @interface TestAnnotation{
int value();
}
使用
@TestAnnotation(value = 1)
public class TestClass{
}
1.如果只有一个属性需要赋值,并且属性名称为value,则value可以省略,直接定义值即可
@TestAnnotation(1)
public class TestClass{
}
2.如果定义属性时,用default关键字给属性默认初始化值,在使用时可不赋值
例:
public @interface TestAnnotation{
int value() default 0;
}
使用
@TestAnnotation()
public class TestClass{
}
3.数组赋值时,使用{}包裹,如果数组只有一个值,则可以省略
例:
public @interface TestAnnotation{
int[] value();
String[] value2();
}
使用
@TestAnnotation(value = 1, value2={"0", "1"})
public class TestClass{
}
4.无属性可以直接使用
例:
public @interface TestAnnotation{
}
使用
@TestAnnotation()
public class TestClass{
}
元注解,有四种类型
* @Target:描述注解能够作用的位置
* ElementType取值:
* TYPE:可以作用于类、接口、enum上
* METHOD:可以作用于方法上
* FIELD:可以作用于成员变量上
* CONSTRUCTOR:构造器
* LOCAL_VARIABLE:局部变量声明
* PACKAGE:包声明
* PARAMETER:参数声明
* @Repeatable:表示注解在同一位置可以出现多次
* @Retention:描述注解被保留的阶段
* @Retention(RetentionPolicy.RUNTIME):当前被描述的注解,会保留到class字节码文件中,并被JVM读取到
* @Retention(RetentionPolicy.CLASS):当前被描述的注解,会保留到class字节码文件中,JVM无法读取到
* @Retention(RetentionPolicy.SOURCE):当前被描述的注解,仅存在源码中
* @Documented:描述注解是否被抽取到api文档中
* @Inherited:描述在父类描述注解子类能否被继承,仅针对类,接口上声明并不会生效
提取注解
需要实现java.lang.reflect.AnnotatedElement接口才可提取
已知实现类
Class
Constructor
Field
Method
Package
获取方法
getAnnotation:返回指定类型的注解,不存在返回null
getAnnotations:返回存在的所有注解
isAnnotationPresent:判断是否包含指定类型的注解
getDeclaredAnnotations:返回直接存在于此元素上的所有注解