概述
java程序中的标注
自定义注解
语法规范
public @interface 注解名称 { public 属性类型 属性名() default 默认值; }
代码实战
// 自定义一个注解类Bookpublic @interface Book {String name();String author();double price();}
元注解
修饰注解的注解
@Target
概念
标识修饰的这个注解能够在哪些程序单元上使用
jkd1.8源码
value成员变量是一个ElementType的数组,可以取下面几个参数
- ElementType.Type
- ElementType.FIELD
- ElementType.METHOD
- ElementType.PARAMETER
- ElementType.CONSTRUCTOR
- ElementType.LOCAL_VARIABLE
- ElementType.ANNOTATION_TYPE
- ElementType.PACKAGE
- ElementType.TYPE_PARAMETER
- ElementType.TYPE_USE
@Retention注解生效的范围,在哪些阶段生效
jdk1.8源码
该注解类Retention的成员变量value可以的几种取值
- RetentionPolicy.SOURCE (在编译阶段生效,注解只作用在源码阶段,生成的字节码文件中不存在)
- RetentionPolicy.CLASS(在源码阶段和字节码文件阶段有效,运行时不存在, 是默认值)
- RetentionPolicy.RUNTIME(注解在源码阶段、字节码文件阶段和运行阶段均有效)
@Documented@Inherited注解解析
判断是否存在注解、存在就解析出内容
与注解解析相关的接口
Annotation:注解的顶级接口,注解都是Annotation类型的对象 AnnotatElement:该接口定义了与注解解析相关的解析方法
所有类成分(Class、Method、Field、Constructor)都实现了AnnotatElement接口,因此具有解析注解的能力
注解解析实战案例
@Retention(RetentionPolicy.RUNTIME)@Target({ElementType.TYPE, ElementType.METHOD})public @interface Book {String name();double price() default 100;String[] authors();}@Book(authors = { "罗贯中","吴承恩","施耐庵","曹雪芹" },name = "《四大名著合辑》")public class BookStore {@Book(authors = { "jack", "lucy" },name = "《泰坦尼克号》", price = 77.7)public void m1() {System.out.println("you jump!!! I jump!!! ");}}@SuppressWarnings("all")public class AnnotationResolveDemo {public static void main(String[] args) throws Exception {BookStore bookStore = new BookStore();Class<? extends BookStore> cls = bookStore.getClass();// 获取TYPE上的注解信息Annotation[] annotations = cls.getDeclaredAnnotations();for(Annotation a: annotations) {System.out.println(a);}// 获取METHOD上的注解信息Method m1 = cls.getMethod("m1");Annotation[] annotations2 = m1.getAnnotations();for(Annotation a: annotations2) {System.out.println(a);}}}
所有类成分(Class、Method、Field、Constructor)都实现了AnnotatElement接口,因此具有解析注解的能力