Java Annotate(一)
jdk环境:1.8
元注解
元注解在java.lang.annotation包下,其注解只能用在注解上
我认为@Target(ElementType.ANNOTATION_TYPE)这样声明为元注解
@Target
Target(目标,目标受众):表面被注释的作用的位置
@Documented
@Retention(RetentionPolicy.RUNTIME)
//Target注解为ANNOTATION_TYPE,及只能声明在注解上
@Target(ElementType.ANNOTATION_TYPE)
public @interface Target {
//可以看出 Target注解 存在一个属性,且传入属性类型为public enum ElementType 枚举数组
ElementType[] value();
}
参数值 | 参数含义 | 墙 | 参数值 | 参数含义 |
---|---|---|---|---|
TYPE | 类、接口(包括注释类型)或枚举声明 | 墙 | FIELD | 成员变量(包括枚举常量) |
METHOD | 方法声明 | 墙 | PARAMETER | 正式的参数声明 |
CONSTRUCTOR | 构造器声明 | 墙 | LOCAL_VARIABLE | 局部变量声明 |
ANNOTATION_TYPE | 注解类型声明 | 墙 | PACKAGE | 包声明 |
TYPE_PARAMETER | 类型参数声明 | 墙 | TYPE_USE | Use of a type |
空参数
//仅用于作为复杂注释类型声明中的成员类型。 它不能被用来直接注释任何东西
@Target({})
public @interface MemberType {
}
单个参数
//用于单个注解类型
@Target(ElementType.ANNOTATION_TYPE)
public @interface MetaAnnotationType {
}
多个参数
//用于以下几个位置
@Target({ElementType.FIELD, ElementType.METHOD, ElementType.FIELD})
public @interface Bogus {
}
@Retention
使用在注解上,表明被注释上的注解将保留多长时间。 如果注释类型声明中没有Retention(保存,保留)注解,则保留策略默认为保留在字节码中
@Documented
//当前注解保留到运行时
@Retention(RetentionPolicy.RUNTIME)
//当前注解只能用在注解中
@Target(ElementType.ANNOTATION_TYPE)
public @interface Retention {
//可以看出 Retention注解 存在一个属性,且属性类型为public enum RetentionPolicy 枚举
RetentionPolicy value();
}
参数值 | 参数含义 |
---|---|
SOURCE | 只存在与源代码中 |
CLASS | 存在与源代码中,也保留于class文件中,但运行时不被jvm保留 |
RUNTIME | 既保留在源码中,也保留于class文件中,还被jvm保留,及保留到运行时刻 |
用法
@Retention(RetentionPolicy.RUNTIME)
//或者不填写
public @interface Retention {}
@Documented
Documented(备有证明文件的)指示带有类型的注释将由javadoc记录 ,如果类型声明用文档化后,它的注释成为公共API的一部分
@Documented
//保留到运行时
@Retention(RetentionPolicy.RUNTIME)
//只作用与注解上
@Target(ElementType.ANNOTATION_TYPE)
public @interface Documented {
}
idea生成javadoc
比如通过idea来生成javadoc Tools>Generate JavaDoc
测试Documented注解
测试类
//jdk的过时注解
@Deprecated
public class test {
@Test
@Deprecated
public void test01(){
System.out.println("invoke test01");
}
}
Deprecated注解内部
//注释成为api的一部分
@Documented
@Retention(RetentionPolicy.RUNTIME)
@Target(value={CONSTRUCTOR, FIELD, LOCAL_VARIABLE, METHOD, PACKAGE, PARAMETER, TYPE})
public @interface Deprecated {
}
org.junit.Test注解内部
//没有标注
@Retention(RetentionPolicy.RUNTIME)
@Target({ElementType.METHOD})
public @interface Test {}
生成的javadoc文档