Java 注解


Java注解是一种元数据,注解不是程序的一部分,用于对程序进行说明。


@Override,注解以@开始,后面跟注解名称。注解是一种特殊的接口。

注解有下面2种:

  • 编译时注解,编译器使用,如@Deprecated@Override@SuppressWarnings
  • 运行时注解,程序运行时通过反射访问注解,得到注解的内容,再根据注解内容做相应的操作。

注解的定义: @interface AnnotationName {
int value() default 0;
}

注解可以没有方法,有一个方法,或有多个方法。注解的方法不能有参数,可以有默认值。 内置的用在自定义注解上的注解有@Target、@Retention、@Inherited、@Documented。

@Target注解用于指定自定义注解用于程序的哪些元素类型上。元素类型有下面几种:

  • TYPE,包含类、接口、枚举(Enum)。
  • FIELD,类属性。
  • METHOD,类方法。
  • CONSTRUCTOR,类构造方法。
  • LOCAL_VARIABLE,方法的局部变量。
  • ANNOTATION_TYPE,注解类型。
  • PARAMETER,方法的参数。 可以将一个注解用在多种元素类型上,例如@Target({ElementType.TYPE, ElementType.FIELD, ElementType.METHOD})

@Retention注解用于指定自定义注解什么时候可用。

  • RetentionPolicy.SOURCE,用于源码,编译时去掉,不会包含在.class文件。
  • RetentionPolicy.CLASS,用于.class文件,编译器可用,JVM不可用,包含在.class文件。
  • RetentionPolicy.RUNTIME,用于运行时,编译器和JVM都可用。

自定义注解

下面是自定义注解的例子

import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
import java.lang.reflect.Method;

public class AnnotationCustom {
    public static void main(String[] args) {
        try {
            Pet p = new Pet();
            Method m = p.getClass().getMethod("like");
            Food f = m.getAnnotation(Food.class);
            System.out.println(f.name());    // bone
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.METHOD)
@interface Food {
    String name() default "apple";
}

class Pet {
    @Food(name = "bone")
    public void like() {
        System.out.println("like");
    }
}