第一步:注解是什么
- 1.注解是
从 JDK 5.0 开始
, Java 增加了对元数据(MetaData) 的支持, 也就是Annotation(注解)
- 2.Annotation 其实就是
代码里的特殊标记
, 这些标记可以在编译, 类加载, 运行
时被读取, 并执行相应的处理。 - 3.通过使用Annotation, 程序员可以
在不改变原有逻辑的情况下, 在源文件中嵌入一些补充信息
。代码分析工具、开发工具和部署工具可以通过这些补充信息进行验证或者进行部署。 - 4.
Annotation
可以像修饰符一样被使用, 可用于修饰包,类, 构造器, 方 法, 成员变量, 参数, 局部变量的声明
, 这些信息被保存在Annotation 的 “name=value”
对中 - 5.注解在
JavaEE/Android
中注解占据了更重要的角色,例如用来配置应用程序的任何切面,代替JavaEE旧版中所遗留的繁冗代码和XML配置
等 - 6.未来的开发模式都是
基于注解
的,JPA是基于注解的
,Spring2.5以上都是基于注解的
,Hibernate3.x以后也是基于注解的,现在的Struts2有一部分也是基于注解的了,注解是一种趋势,一定程度上可以说:框架 = 注解 + 反射 + 设计模式
。
第二步:注解怎么使用:
2.1.开发环境搭建
- Linux中搭建单体环境、集群环境、主从环境等
2.2.开发中使用:
- 命令行使用
- IDEA开发调用API
3.2.常见的注解举例:
a.常见的注解举例1:
@param @return 和 @exception
这三个标记都是只用于方法的。@param的格式要求
:@param 形参名 形参类型 形参说明@return 的格式要求
:@return 返回值类型 返回值说明@exception的格式要求
:@exception 异常类型 异常说明@param和@exception可以并列多个
- 在编译时进行格式检查(
JDK内置的三个基本注解
)@Override
: 限定重写父类方法, 该注解只能用于方法
@Deprecated
: 用于表示所修饰的元素(类, 方法等)已过时。通常是因为所修饰的结构危险或存在更好的选择@SuppressWarnings
: 抑制编译器警告
b.常见注解示例举例2:
跟踪代码依赖性,实现替代配置文件
- 1.
Servlet3.0提供了注解(annotation),使得不再需要在web.xml文件中进行Servlet的部署
- 2.
spring框架中关于“事务”的管理
3.3.自定义注解
a.自定义注解过程:
- 1.自定义注解
自动继承了java.lang.annotation.Annotation接口
- 2.
Annotation
的属性(成员变量)在 Annotation 定义中以无参数方法
的形式来声明。其方法名和返回值定义了该成员的名字和类型
。我们称为配置参数
。类型只能是八种基本数据类型、String类型、Class类型、enum类型、Annotation类型以上所有类型的数组
- 3.可以在定义 Annotation 的成员变量时为其指定初始值, 指定成员变量的初始值可使用 default 关键字
- 4.如果只有一个
成员变量(属性)
,建议使用参数名为value
- 5.如果定义的注解
含有配置参数
,那么使用时必须指定参数值
,除非它有默认值
。指定参数值的格式是:(“参数名 = 参数值”)
,若只有一个参数成员,且名称为value,可以省略“value=”
- 6.
没有成员定义的 Annotation 称为标记
;包含成员变量的 Annotation 称为元数据 Annotation
Override
注解就是一个标记
- 7.注意:自定义注解
必须配上注解
的信息处理流程(使用反射)
才有意义
3.4.JDK中的元注解
a.什么是元注解:
- 1.
对现有的注解进行解释说明的注解被称之为元注解
- 2.jdk提供了4种元注解;
Retention
Target
Documented
Inherited
- 3.
元数据的理解
:对现有数据进行修饰的数据,叫做元数据,这里的name,String都可以称之为元数据:String name = “atguigu”
b.@Retention:
- 1.
@Retention
: 只能用于修饰一个 Annotation 定义,用于指定该 Annotation 的生命周期,
- 2.
@Rentention
包含一个RetentionPolicy 类型
的成员变量, 使用@Rentention 时必须为该 value 成员变量指定值: - 3.
RetentionPolicy.SOURCE
:仅仅在源文件中有效(即源文件保留),在编译器直接丢弃这种策略的注释
- 4.
RetentionPolicy.CLASS
:在class文件中有效(即class保留)
,当运行 Java 程序时
,JVM 不会保留注解
。 这是默认值
- 5.
RetentionPolicy.RUNTIME
:在运行时有效(即运行时保留)
,当运行 Java 程序时,JVM 会保留注释
。程序可以通过反射获取该注释
c.@Target
- 1.用于修饰 Annotation 定义, 用
于指定被修饰的 Annotation 能用于修饰哪些程序元素
。 - 2.@Target
也包含一个名为 value 的成员变量
d.@Documented:
- 1.用于指定被该元 Annotation 修饰的 Annotation 类将被javadoc 工具提取成文档。默认情况下,javadoc是不包括注解的。
- 2.定义为Documented的注解必须设置Retention值为RUNTIME。
e.@Inherited:
- 1.被它
修饰的 Annotation 将具有继承性
。如果某个类使用了被@Inherited 修饰的 Annotation, 则其子类将自动具有该注解
。- 比如:如果把标有@Inherited注解的自定义的注解标注在类级别上,子类则可以继承父类类级别的注解
- 实际应用中,使用较少
3.5.利用反射获取注解信息
- 1.jdk 5.0 在
java.lang.reflect
包下新增了 AnnotatedElement 接口
, 该接口代表程序中可以接受注解的程序元素
- 2.当一个 Annotation 类型被定义为
运行时 Annotation 后
, 该注解才是运行时可见
, 当class 文件被载入时保存在 class 文件中的 Annotation 才会被虚拟机读取
- 3.程序可以
调用 AnnotatedElement对象
的如下方法来
访问 Annotation 信息
3.6.jdk1.8中的注解的新特性:
- 1.Java 8对注解处理提供了两点改进:
可重复的注解
、类型注解
- 2.
反射也得到了加强
,在Java8中能够得到方法参数的名称。这会简化标注在方法参数上的注解
a.可重复注解:
- 自定义注解实现可重复注解:
b.类型注解
- jdk1.8之后,关于
元注解@Target
的参数类型ElementType枚举值多了两个
:TYPE_PARAMETER
,TYPE_USE
- 在Java 8之前,注解只能是在声明的地方所使用,
Java8开始,注解可以应用在任何地方
ElementType.TYPE_PARAMETER
:表示该注解能写在类型变量的声明
语句中(如:泛型声明)
ElementType.TYPE_USE
表示该注解能写在使用类型的任何语句中
- 在Java 8之前,注解只能是在声明的地方所使用,
第三步:注解原理
3.1.工作原理
3.2.源码阅读:
3.3.生产调优
第四步:注解相关面试:
- 面试常见问题整理