1.注解的概述
可以给当前程序的开发者提供必要的信息和标记,便于开发。
可以给代码编译提供数据。
2.注解定义的基本格式
@Documented
@Retention(RetentionPolicy.SOURCE)
@Target(value = {...}) // annotationType
@Inherited
public @interface MyAnnotation1 {
}
@Documented : 标记当前注解参与javadoc操作,可以生成对应的javadoc文档
@Retention : 决定一条注解应该保留多长时间,作用于哪一阶段。分别为:RetentionPolicy.SOURCE(可以参与编译阶段,但是不会加载到程序运行阶段);RetentionPolicy.CLASS(可以在Class文件中存在);
RetentionPolicy.RUNTIME(可以参与代码编译过程,通过反射操作获取对应信息)---默认为CLASS
@Target : 决定当前注解可以作用于 Java 代码中那一部分内容,通过枚举 ElementType 来决定当前注解可以使用范围
ElementType | 功能概述 |
ElementType.TYPE | 表示当前注解可以用于类和接口,以及枚举 |
ElementType.FIELD | 表示当前注解可以用于成员变量 |
ElementType.METHOD | 表示当前注解可以用于成员方法 |
ElementType.PARAMETER | 表示当前注解可以用于成员方法参数 @NotNull |
ElementType.CONSTRUCTOR | 表示当前注解可以用于构造方法 |
ElementType.ANNOTATION_TYPE | 表示当前注解可以用于注解 |
ElementType.LOCAL_VARIABLE | 表示当前注解可以用于局部变量 |
ElementType.PACKAGE | 表示当前注解可以用于包 |
2.1 注解支持的数据类型
基本类型,String,Enum,注解,和以上类型的数组。
2.2 注解属性的使用和获取
@Documented
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.TYPE)
public @interface MyAnnotation3 {
//以方法之式,行变量之实,实则为方法
int value();
String name();
}
@MyAnnotation3(value = 16, name = "年龄")
public class Demo1 {
public static void main(String[] args) {
Class<Demo1> cls = Demo1.class;
MyAnnotation3 annotation3 = cls.getAnnotation(MyAnnotation3.class);
System.out.println(annotation3.value());
System.out.println(annotation3.name());
}
}