package com.sf.anno; import java.lang.annotation.*; // 声明这是一个注解 // 元注解 是声明注解用法的注解 // Target 目标 指定注解使用的位置 ElementType是枚举类型 // 如果是 ElementType.TYPE 那么意思是注解放在类上 // 如果是 ElementType.FIELD 那么意思是注解放在字段上 // 如果是 ElementType.METHOD 那么意思是注解放在方法上 // 如果是 ElementType.PARAMETER 那么意思是注解放在方法参数上 // 如果是 ElementType.CONSTRUCTOR 那么意思是注解放在构造器上 // Retention 保留期 注解的存活时间 // RetentionPolicy是提供了几种使用保留期的方式 // 如果是RetentionPolicy.SOURCE 只在源代码阶段保留 .java源代码 -> .class字节码 -> jvm识别为机器语言 // 如果是RetentionPolicy.CLASS 只在字节码阶段保留 .java源代码 -> .class字节码 -> jvm识别为机器语言 // 如果是RetentionPolicy.RUNTIME 在代码运行阶段也就是JVM中保留 .java源代码 -> .class字节码 -> jvm识别为机器语言 // Inherited 如果注解被此注解标注 而子类没有被其他注解标注 那么子类会继承父类的注解 @Inherited @Target({ElementType.TYPE}) @Retention(RetentionPolicy.RUNTIME) public @interface TestAnno { // 注解只有成员变量 没有方法 // 以没有入参的方法来声明变量 int id() default 0; // 可以声明参数的默认值 String msg() default ""; }