@interface 声明
package test;
public @interface InProgress { }
@InProgress
public void calculateInterest(float amount, float rate) {
}
带成员
public @interface TODO {
String value();
}
@InProgress
//只有成员变量名有value时,值有给value赋值时可以这么写
@TODO("Figure out the amount of interest per month")
//@TODO(value="Figure out the amount of interest per month")
public void calculateInterest(float amount, float rate) {
}
成员带默认值
public @interface GroupTODO {
public enum Severity { CRITICAL, IMPORTANT, TRIVIAL, DOCUMENTATION };
Severity severity() default Severity.IMPORTANT;
String item();
String assignedTo();
String dateAssigned();
}
@InProgress
@GroupTODO(item="Figure out the amount of interest per month",assignedTo="BrettMcLaughlin",dateAssigned="08/04/2004")
public void calculateInterest(float amount, float rate) {
// Need to finish this method later
}
改写默认值
@InProgress
@GroupTODO(severity=GroupTODO.Severity.DOCUMENTATION,item="Need to explain how this rather unusual method works",assignedTo="Jon Stevens",dateAssigned="07/30/2004")
public void reallyConfusingMethod(int codePoint) {
// Really weird code implementation
}
对注释的注释
结束关于注释的讨论之前(至少在本系列文章中),我想简要地讨论一下注释的注释。第 1 部分中所接触的预定义注释类型都有预定义的目的。但是在编写自己的注释类型时,注释类型的目的并不总是显而易见的。除了基本的文档外,可能还要针对某个特 定的成员类型或者一组成员类型编写类型。这就要求您为注释类型提供某种元数据,以便编译器保证按照预期的目的使用注释。
当然,首先想到的就是 Java 语言选择的元数据形式 —— 注释。您可以使用 4 种预定义的注释类型(称为 元注释 )对您的注释进行注释。我将对这 4 种类型分别进行介绍。
@Target 声明
指定自定义注释的应用范围,规定的范围类型如下
package java.lang.annotation;
public enum ElementType {
TYPE, // Class, interface, or enum (but not annotation)
FIELD, // Field (including enumerated values)
METHOD, // Method (does not include constructors)
PARAMETER, // Method parameter
CONSTRUCTOR, // Constructor
LOCAL_VARIABLE, // Local variable or catch clause
ANNOTATION_TYPE, // Annotation Types (meta-annotations)
PACKAGE // Java package
}
以下表示将自定义注释@TODO可用于类(包括接口和枚举),方法、构造函数和其他注释类型。
import java.lang.annotation.ElementType;
import java.lang.annotation.Target;
@Target({ElementType.TYPE,ElementType.METHOD,ElementType.CONSTRUCTOR,ElementType.ANNOTATION_TYPE})
public @interface TODO {
String value();
}
@Retention 声明
可用的值范围(一般都使用RUNTIME,在程序运行时,可以通过自定义注释来反射完成一些功能需要)
package java.lang.annotation;
public enum RetentionPolicy {
SOURCE, // Annotation is discarded by the compiler
CLASS, // Annotation is stored in the class file, but ignored by the VM
RUNTIME // Annotation is stored in the class file and read by the VM
}
因为 Retention 只有一个成员变量,可以使用默认赋值方式
@Retention(RetentionPolicy.SOURCE)
public @interface SuppressWarnings {
// annotation type body
}
@Documented 声明
这个元注释也非常容易理解,部分原因是 Documented 是一个标记注释。标记注释没有成员变量。 Documented 表示注释应该出现在类的 Javadoc 中。在默认情况下,注释不包括在 Javadoc 中。
import java.lang.annotation.Documented;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
@Documented
@Retention(RetentionPolicy.RUNTIME)
public @interface InProgress { }
使用 Documented 注释类型时@Retention必需取值RUNTIME 。这样,注释就会保留在编译后的类文件中并且由虚拟机加载,然后Javadoc可以从中抽取出来添加到类的HTML文档中。实例说明https://www.jb51.net/article/263413.htm
@Inherited 声明
生成javadoc时父类中的注释会出现在子类中,默认不出现
import java.lang.annotation.Documented;
import java.lang.annotation.Inherited;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
@Documented
@Inherited
@Retention(RetentionPolicy.RUNTIME)
public @interface InProgress { }