JDK5-注解

注解是一个类,一个声明就是一个对象

简单注解

@SuppressWarnings("msg") - 压缩/抑制警告
@Deprecated - 声明过时
@Override - 声明复写

自定义注解

public @interface Anno {
}

注解的使用

@Anno
public class AnnoTest {
    public static void main(String[] args) {
        if(AnnoTest.class.isAnnotationPresent(Anno.class)) {
            Anno anno = (Anno)AnnoTest.class.getAnnotation(Anno.class);
            ...
        }
    }
}

但是在这里我们发现:无法获取到Anno的实例,是因为Anno注解在加载进内存时被去除了

注解的生命周期
源文件:RetentionPolicy.SOURCE(如SuppressWarnings及Override)
class文件:RetentionPolicy.CLASS(默认
内存字节码:RetentionPolicy.RUNTIME(如Deprecated)

重定义注解

@Retention(RetentionPolicy.RUNTIME)
public @interface Anno {
}

元注解

元注解:对注解进行注解的注解(@Retention、@Target、@Documented和@Inherited)-> java.lang.annotation

@Retention:设置注解的可见性(生命周期)
@Target:设置注解的作用目标
@Documented:指示javadoc应该为注解生成文档
@Inherited:指示在子类继承父类时继承本注解

注解的作用范围

Target元注解:@Target(ElementType[])

如:
@Target({ElementType.TYPE, ElementType.METHOD})
@Target(ElementType.TYPE)  // 一个元素可以省略{}

ElementType

TYPE:所有元素(类、接口、枚举...)
PARAMETER:参数
PACKAGE:包
METHOD:方法
LOCAL_VARIABLE:局部变量
FIELD:属性
CONSTRUCTOR:构造器
ANNOTATION_TYPE:注解

为注解加属性(方法)

注解中属性的类型:八种基本类型、String、Class(ClassName.class)、enum以及上述类型的数组

@Retention(RetentionPolicy.RUNTIME)
public @interface Anno {
    String color();
}

@Anno(color="red")
public class AnnoTest {
    public static void main(String[] args) {
        if(AnnoTest.class.isAnnotationPresent(Anno.class)) {
            Anno anno = (Anno)AnnoTest.class.getAnnotation(Anno.class);
            System.out.println(anno.color());
        }
    }
}

为注解属性添加默认值

若注解内只有一个属性且名为value或除value外其他属性均有默认值时,赋值时可以省略value,如下:

@Retention(RetentionPolicy.RUNTIME)
public @interface Anno {
    String value();
}

@Retention(RetentionPolicy.RUNTIME)
public @interface Anno2 {
    String color() default "red";// 为属性设置默认值
    String value();
    int[] array() default {1, 2, 3};
    Anno annotation() default @Anno("Joshua");    // 注解中属性为注解
}

@Anno("Joshua")
@Anno2("Joshuaber")
public class AnnoTest {
    public static void main(String[] args) {
        if(AnnoTest.class.isAnnotationPresent(Anno.class)) {
            Anno anno = (Anno)AnnoTest.class.getAnnotation(Anno.class);
            System.out.println(anno.value());
        }
    }
}

Anno2也可也这样引用:@Anno2(color="blue", value="Joshua", array=1)

你可能感兴趣的:(JDK5-注解)