java-doc-注解

注解(元数据)

Java支持在源文件中嵌入补充信息,这类信息称为注解(annotation)。注解不会改变程序的动作,因此也就不会改变程序语义。但是在开发和部署期间,各种工具可以使用。术语“元数据”(metadata)也用于表示这个特性。

指定保留策略

保留策略决定了在什么位置丢弃注解,Java定义了3种策略,它们被封装到java.lang.annotation.RetentionPolicy枚举中。

策略 描述
SOURCE 只在源文件中保留,在编译期间会被抛弃
CLASS 在编译时被存储到.class文件中,但是,在运行时通过JVM不能得到这些注解
RUNTIME 在编译时被存储到.class文件中,并且在运行时通过JVM获取这些注解
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.reflect.Method;


@Retention(RetentionPolicy.RUNTIME)
@interface MyAnno
{
String str() default "Testing";
int val() default 900;
}

class Meta
{
@MyAnno()
public static void myMeth()
{
Meta ob = new Meta();

try {
Class<?> c = ob.getClass();

Method m = c.getMethod("myMeth");
MyAnno anno = m.getAnnotation(MyAnno.class);

System.out.println(anno.str() + " " + anno.val());
} catch (NoSuchMethodException exc) {
System.out.println("Methmod not found");
}
}
}

public class LearnAnnotation
{
public static void main(String args[])
{
Meta.myMeth();
}
}

内置注解

  • @Retention
    @Retetion被设计为只能用于注解其他注解,用于指定保留策略

  • @Documented
    @Document注解是标记接口,被设计为只能注解其他注解,用于通知某个工具————注解将被文档化。

  • @Target
    @Target用于指定可以应用注解的声明的类型,被设计为只能注解其他注解。@Target只有一个参数,这个参数必须是来自ElementType枚举的常量,这个参数指定了将为其应用注解的声明类型。

目标常量 可应用注解的声明的类型
ANNOTATION_TYPE 另外一个注解
CONSTRUCTOR 构造函数
FIELD 域变量
LOCAL_VARIABLE 局部变量
METHOD 方法
PACKAGE
PARAMETER 参数
TYPE 类、接口或枚举
TYPE_PARAMETER 类型参数(JDK8新增)
TYPE_USE 类型使用(JDK8新增)
  • @Inherited
    @Inherited是标记注解,只能用于另外一个注解声明。@Inherited会导致超类的注解被子类基础。所以,在查询子类的特定注解时,如果那种注解在子类中不存在,就会检查超类。如果那种注解存在于超类中,并且如果使用@Inherited进行了注解,就将返回那种注解

  • @Override
    @Override是标记注解,只能用于方法。使用带有@Override注解的方法必须重写超类中的方法。如果不这样做的话,就会产生编译时报错。@Override注解用于确保超类方法被正确的重写,而不是简单的重载。

  • @Deprecated
    @Deprecated是标记注解,用于指示声明时过时的,并且已经被更新的形式取代。

  • @FunctionalInterface
    @FunctionalInterface是JDK8新添加的一个标记注解,用于接口,指出被注解的接口是一个函数是接口。如果被注解的接口不是函数式接口,将报告编译错误。

  • @SafeVarargs
    @SafeVarargs是标记注解,只能用于方法和构造函数,指示没有发生于可变长度相关的不安全动作。如果不安全代码于不能具体化的varargs类型相关,或者与参数化的数组实例相关,那么@SafeVarargs注解用于抑制“未检查不安全代码”警告。@SafeVarargs注解只能用于varargs方法或者声明为static或final的构造函数。

  • @SuppressWarnings
    @SuppressWarnings注解用于指定能抑制一个或多个编译器可能会报告的警告。使用以字符串形式表示的名称来指定要被抑制的警告。