1.注解(Annotation)
注解(Annotation)是 Java 5 引入的一种元数据(metadata)机制,用于为 Java 代码(类、方法、变量、参数和包等)提供额外的信息。这些注解可以在编译时由编译器处理,或在运行时通过反射机制被读取和处理。定义的注解本质是一个接口,Java中所有注解都继承了Annotation接口,注解的使用其实是一个接口的实现类对象,实现了该注解及Annotation接口
public @interface 注解名称 {
public 属性类型 属性名() default 默认值;
... ...
}
注:特殊属性名value,如果注解中只有一个value属性,或除了value属性其他属性都有默认值,则使用注解时,value名称可以不写
2.Java元注解
元注解:元注解可以为被修饰的注解提供额外的信息或约束
(1)@Retention
声明被修饰的注解的保留周期
取值 | 保留范围 |
---|---|
RetentionPolicy.SOURCE | 注解的信息只会保留在源代码中,不包含在编译完的类文件中 |
RetentionPolicy.CLASS | 注解的信息包含在编译完的类文件中,JVM加载时丢弃,@Retention注解的默认值 |
RetentionPolicy.RUNTIME | 注解的信息包含在编译完的类文件中,加载到JVM中,可进行反射读取 |
(2)@Documented
声明被修饰的注解是否会被javadoc和类似的工具记录
(3)@Target
声明被修饰的注解的使用范围
取值 | 使用范围 |
---|---|
ElementType.TYPE | 应用于类、接口(包含注解类型)、枚举 |
ElementType.CONSTRUCTOR | 应用于构造方法 |
ElementType.PARAMETER | 应用于方法的参数 |
ElementType.FIELD | 应用于字段(属性) |
ElementType.METHOD | 应用于方法 |
ElementType.PACKAGE | 应用于包 |
ElementType.LOCAL_VARIABLE | 应用于局部变量 |
ElementType.TYPE_PARAMETER | 应用于类型变量 |
ElementType.TYPE_USE | 应用于任何使用类型的语句中 |
(4)@Inherited
声明被修饰的注解是否可以被继承,如果注解类型声明中存在 @Inherited 元注解,则注解所修饰类的所有子类都将会继承此注解
(5)@Repeatable
声明被修饰的注解是否可以重复使用
3.注解解析
判断类上、方法上、成员变量上是否存在注解,并把注解里的内容解析出来。要解析谁上的注解,就应先拿到谁。比如要解析类上的注解,则应该先获取到该类的Class对象,再通过Class对象解析其上面的注解。比如要解析成员方法上的注解,则应该获取到成员方法的Method对象,再通过Method对象解析其上面的注解。注:Class、Method、Field、Constructor都实现了AnnotatedElement接口,他们都拥有解析注解的能力
方法 | 作用 |
---|---|
public Annotation[] getAnnotations() | 获取全部Annotation信息 |
public <T extends Annotation> T getDeclaredAnnotation(Class<T> annotationClass) | 获取指定类型的Annotation |
public boolean isAnotationPresent(Class<? extends Annotation> annotaionClass) | 是否存在指定类型的Annotation |