注解(Annotation)
就是自己定义注解
public @interface 注解名称
public 属性类型 属性名() default 默认值;
特殊属性名:value
如果注解中只有一个value属性,使用注解时,value名称可以不用写
注解原理
(1)注解本质是一个接口,Java中所有注解都继承了Annotation接口
(2)注解格式"@注解(…)",本质上就是该注解的一个实现类对象,实现了该注解以及Annotation
public @interface Anno1 {
//基本类型
public int a() default 18;
//String
public String name(); //没有默认值default可以省略
//Class
public Class clazz() default Anno2.class;
//注解
public Anno2 anno() default @Anno2;
//枚举
public Season season() default Season.SPRING;
//以上类型的一维数组
public int[] arr() default {1, 2, 3, 4, 5};
public Season[] seasons() default {Season.SPRING, Season.SUMMER};
}
//如果属性没有指定默认值,使用需要手动指定默认值(Anno1中的name没有默认值)
@Anno1(name = "tom")
@MyAnno("tom")
class Test {
}
@interface Anno2 {
}
@interface MyAnno {
//特殊属性名:value
String value();
}
enum Season {
SPRING, SUMMER, AUTUMN, WINTER
}
注解中的属性类型:基本类型、String、Class、注解、枚举以上类型的一维数组
@Target
作用:声明被修饰注解能使用的位置
@Target(ElementType.TYPE)
@Retention
作用:声明注解的保留周期
@Retention(RetentionPolicy.RUNTIME)
@MyAnno
public class Demo {
@MyAnno
private String name;
@MyAnno
public void test() {
}
}
//1、声明被修饰注解的使用位置
@Target({ElementType.TYPE, ElementType.FIELD, ElementType.METHOD})
//2、声明注解的保留周期(查看@Test上的元注解)
@Retention(RetentionPolicy.RUNTIME)
@interface MyAnno {
}