@interface 准确的说它不是一个接口,而是一个新的注释类型-注释类,它的类名就是注释名 元注解是用于修饰其它注解的注解。JDK5.0提供了四种元注解: @Retention 只能用于修饰一个 Annotation 定义 三种值: ▷ RetentionPolicy.SOURCE: 只在源代码阶段保留,编译后不保留,不会出现在字节码文件中。通常用于生成文档等工具。 ▷ RetentionPolicy.CLASS: 在编译阶段保留,但不会加载到JVM中,在字节码文件中存在。这是Java默认的保留策略。 ▷ RetentionPolicy.RUNTIME: 编在运行时保留,可以通过反射获取到这些注解。常用于运行时的动态处理。 @Target 指定注解可以应用的目标元素类型。 ElementType.TYPE:可以应用于类、接口或枚举。 ElementType.FIELD:可以应用于字段或属性。 ElementType.METHOD:可以应用于方法。 ElementType.PARAMETER:可以应用于方法的参数。 ElementType.CONSTRUCTOR:可以应用于构造函数。 ElementType.LOCAL_VARIABLE:可以应用于局部变量。 ElementType.ANNOTATION_TYPE:可以应用于其他注解。 ElementType.PACKAGE:可以应用于包。 @Inherited:用于指定注解是否具有继承性。 如果一个注解被@Inherited元注解标记,并且它应用于某个类,那么这个注解会被其子类继承。在类继承关系中,子类会自动继承父类上的被@Inherited标记的注解。 @Document 用于指定注解是否应该被包含在JavaDoc文档中。 如果一个注解被@Documented元注解标记,并且它应用于某个元素(如类、方法、字段等),则在生成JavaDoc文档时,这个注解会被包含在文档中,方便开发者查看。 如果一个注解被@Inherited元注解标记,并且它应用于某个类,那么这个注解会被其子类继承。在类继承关系中,子类会自动继承父类上的被@Inherited标记的注解。
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
// 定义元注解
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.METHOD)
@interface MethodInfo {
String author() default "Unknown";
String date();
int revision() default 1;
String comments();
}
public class MyClass {
// 使用自定义注解
@MethodInfo(author = "Alice", date = "2023-07-20", comments = "This is a sample method.")
public void sampleMethod() {
// Method implementation
}
public static void main(String[] args) {
// 获取注解信息
MethodInfo methodInfo = MyClass.class.getDeclaredMethod("sampleMethod").getAnnotation(MethodInfo.class);
System.out.println("Author: " + methodInfo.author());
System.out.println("Date: " + methodInfo.date());
System.out.println("Revision: " + methodInfo.revision());
System.out.println("Comments: " + methodInfo.comments());
}
}
首先定义了一个名为MethodInfo
的自定义注解,它具有author
、date
、revision
和comments
等成员。然后,在MyClass
类中,我们使用了@MethodInfo
注解来标注一个方法sampleMethod()
。
在main
方法中,我们使用Java的反射机制获取了sampleMethod
方法上的MethodInfo
注解,并输出了注解中的信息,包括作者、日期、修订版本和注释。