前言
为什么需要学习注解?
1.能够灵活地使用框架提供的注解,最后能够读懂框架的源码
2.能够配合反射将代码书写更加的灵活,更加易于维护易于扩展,Properties配置,XML配置,注解配置[Java配置]
3.极大程度地简化了代码,提高了代码的可读性
注解的概述
Java提供了一种源程序中元素和任何信息或者元数据相关联的一种方法或者渠道
源程序中元素: Java文件 构造方法、成员变量、成员方法...
信息: 就是一些配置数据 【也可以理解为是注释】
元数据: 就是元注解,对注解进行注解,后面学习
关联: 元素和注释绑定成为注解
简单来说: 就是相当于一些类似于注释的信息 和 源程序中的元素 绑定的一种技术,这种技术叫做注解
这种手段可以通过反射获取到元素对象,在获取到这个元素上面绑定的注解,通过绑定的注解获取里面配置信息,
从而达到能够在程序运行阶段通过这些信息动态地改变程序的运行逻辑
常见注解
JDK中常见的注解
@Override: 表示注解修饰的方法必须满足重写的规则
@Deprecated: 表示成员过时,编译器可以在程序运行的时候获取到该注解
@SupressWarnings: 表示忽略编译器的警告
@FunctionalInterface: 表示该接口是一个函数式接口,并且可以作为Lambda表达式参数传入
注解分类
注解的分类
按照运行的机制分类:
源码注解: 注解只在源码中有效,当编译生成字节码文件的时候,注解就不存在了,其实就是注释 APT
编译时注解: 注解在源码和编译时期有效,在jvm运行的时候就不存在了
运行时注解: 注解在源码和编译有效,同时在程序的执行过程也存在 (反射获取运行时注解,从而获取到注解的配置信息动态改变程序的逻辑)
元注解: 对注解进行注解的注解
按照来源分类:
JDK中自带的注解: @Override,@Deprecated
第三方注解: @Table,@Column,@Component,@Service,@Bean
自定义注解: 自己定义注解自己使用在自己的代码中
元注解: 对注解进行注解的注解
自定义注解并且使用
四种使用注解的方式:
格式一: @注解的名称(属性名1=属性值1,属性名2=属性值2,属性名3=属性值3,...属性名n=属性值n)
注意: 如果有两个以上的属性,有多少个属性就必须给多少个属性赋值
格式二: 适用于注解只有一个成员
@注解的名称(属性值)
格式三: 适用于成员是数组的情况
@注解的名称({属性值1,属性值2,属性值3,...属性值n})
格式四: 使用标记注解
@注解的名称
使用反射来注解
使用反射解析注解:
1.使用反射解析类或者接口或者枚举上面的注解,必须先要获取到字节码文件对象
2.解析除了类上的注解外,必须先获取到元素对象
3.获取注解之前一定要做存在性判断
为什么? 因为如果是源码或者编译时注解,那么反射是在运行时获取,注解在运行时已经不存在就获取不到
通过反射获取注解元素的相关方法:
A getAnnotation(Class annotationClass)
Annotation[] getAnnotations()
Annotation[] getDeclaredAnnotations()
boolean isAnnotationPresent(Class extends Annotation> annotationClass)