介绍
最近想深入了解一下java,就想到了来读一读java源码。下面是我们的jdk版本,以及java注解所在的包。注解本质是一个继承了Annotation的特殊接口,其具体实现类是Java运行时生成的动态代理类。通过代理对象调用自定义注解(接口)的方法,会最终调用AnnotationInvocationHandler的invoke方法。该方法会从memberValues这个Map中索引出对应的值。而memberValues的来源是Java常量池。
image.pngjdk版本1.8
package java.lang.annotation;
可以看的java注解在 rt.jar 下面的java.lang.annotation包中。
注解的分类
Java 1.5中开始引入的Annotation,类似于注释解释的一种技术,我们常常使用它在代码中来做一些注释,并且在适当(编译代码或运行代码等时机)的时候,对其进行解释,并且做一些额外的操作
下面我用idea自带的diagram工具打开它们之间的联系。
image.png我们先来看看这两个枚举类:
- ElementType: 这个枚举类型的常量定义了注解适用的目标,结合
Target
注解使用
1.TYPE Class类,接口(包括注解类型或者enum类型)
2.FIELD 属性(包括enum实例)
3.METHOD 方法
4.PARAMETER 方法参数
5.CONSTRUCTOR 类构造器
6.LOCAL_VARIABLE 本地变量
7.ANNOTATION_TYPE 注解类型
8.PACKAGE 包
- RetentionPolicy: 定义注解保存级别。 这个枚举类型的常量描述保留注释的各种政策。 他们结合使用
Retention
元注解类型进行指定注解要保留多长时间。
1.SOURCE 源代码注解,被编译器丢弃
2.CLASS 类注解,被编译器记录在class文件中,运行时被VM丢弃,在编译时使用,属于默认配置
3.RUNTIME 被编译器记录在class文件中,运行时可用,被VM保留,所以可以在运行时搭配反射使用
注解异常处理
下面三个类是注解的异常处理类,注解类型不匹配异常,格式化异常
image.png元注解
image.png- Annotation:定义了注解的常用方法
- Documented:标志将此注解包含至javadoc中
- Inherited: 注解允许继承
- Repeatable: 可以重复的注解 jdk 1.8新增
- Retention: 定义注解保存级别
- Target: 定义注解适用的目标
- Native:表示一个定义常量值的字段可以从本机代码被引用。
网友评论