Java Annotation 总结
文章目录
一、
1.1注解: Annotation
- 从JDK1.5 引入
- 位于源码中(代码/注解/注释),使用其他工具进行处理的标签
- 注解用来修饰程序的元素,但不会对被修饰的对象有直接的影响
- 只有通过某种配套的工具才会对注解信息进行访问和处理
- 主要用途
- 提供信息给编译器 / IDE工具
- 可用于其他工具来产生额外的代码 / 配置文件等
- 有一些注解可以在程序运行时访问,增加程序的动态性
JDK预定义的普通注解(部分)
- @Override 表示继承和覆写 自带注解
- @Deprecated 表示废弃 自带注解
- SuppressWarnings 表示压制警告 自带注解
- SafeVargrgs 不会对不定项参数做危险操作 自带注解
- FunctionInterface 声明功能性接口 自带注解
JDK预定义的元注解(部分)
- @Target 设置目标范围 元注解
- @Retention 设置保持性 元注解
- @Documented 文档 元注解
- @Inherited 注解继承 元注解
- @Repeatable 此注解可以重复修饰 元注解
普通注解和元注解的区别:普通注解是修饰Java 元素的,而元注解是修饰注解的一种注解。
1.2、 自定义注解
1.2.1 注解属性可以包括的类型
- 8 种基本类型(short int long float double byte char boolean )
- String
- Class
- enum 类型
- 注解类型
- 由前面类型组成的数组
package com;
public @interface BugReport {
enum Status {UNCONFIRMED,CONFIRMED,FIXED,NOTABUG};
boolean showStopper() default true;
String assiganedTo() default "[none]";
Status status() default Status.UNCONFIRMED;
String [] reporteBy();
首先定义三个注解:
#第一个
public @interface Test1 {
}
#第二个
public @interface Test2 {
int value() default 1;
}
#第三个
public @interface Test3 {
int a() default 2;
int b() default 3;
}
注解的使用:此时因为没有元注解的修饰,所以使用范围还不能确定,暂时就当全作用在类上。
- @Test1
- @Test2
- @Test2(3)
- @Test2(value = 5)
- @Test3
- @Test3(a=1)
- @Test3(a=1,b=2)
- @Test3(b=1,a=2)
注意不可以写成 @Test3(1,2)
1.2.2 注解使用的位置
- @Target 可以限定目标注解作用于什么位置
允许的位置
1. 包
2. 类
3. 接口
4. 方法
5. 构造器
6. 成员变量
7. 局部变量、形参变量、类型参数
- ElementType.ANNOTATION_TYPE (修饰注解)
- ElementType.CONSTRUCTOR (构造方法)
- ElementType.FIELD(属性字段上)
- ElementType.LOCAL_VARIABLE(本地变量上)
- ElementType.METHOD (方法上)
- ElementType.PACKAGE (包上)
- ElementType.PARAMETER(作用在参数上,形参)
- ElementType.TYPE(任何类型,即上面的类型都可以修饰)
- Retention (保留)
- 示例: @Retention(RetentionPolicy.RUNTIME)
- 这个注解用来修饰其他注解的存在范围
- RetentionPolicy.SOURCE 注解仅存在源码,不在 class 文件。
- RetentionPolicy.CLASS **这是默认的注解保留策略**。注解存在于.class 文件但是不能被JVM加载。
- RetentionPolicy.RUNTIME 这种策略下,注解可以被JVM运行时访问到。通常情况下可以结合反射来做一些事情。
- Inherited (继承)
- 让一个类和它的子类都包含某个注解
- 普通的注解没有继承功能
- Repeatable
- 自JDK 1.8 引入
- 表示被修饰的注解可以重复应用标注
- 需要定义注解和容器注解
- Documented
- 指明这个注解可以被 Javadoc 工具解析,形成帮助文档
1.2.3 注解解析
-
RetentionPolicy.RUNTIME:注解在class 文件中,被JVM 加载,可用反射解析注解
- Class.getAnnotations() 获取注解类的 注解
- Class.isAnnotation() 返回布尔值,判断类是否有注解
- Class.isAnnotationPresent(Class AnnotationClass) 参数为 类 类型的 注解 类型,作用为判断当前类是否存在指定的注解类型
- Method.getAnnotations() 获取方法的注解
- Method.isAnnotationPresent(Class annotationClass) 判断当前方法有没有指定的类型的注解
- Field.getAnnotations() 获取字段的注解
- Field.isAnnotationPresent(Class annotaionClass) 判断当前字段有没有指定类型的注解
- Constructor.getAnnotations() 获取构造方法的所有注解
- Constructor.isAnnotationPresent(Class annotationClass) 获取构造方法的指定类型的注解
-
在 Class 和 Resource 级别的保留,对于注解解析比较麻烦,这里不再介绍。
二、
2.1、注解的应用
这里在简单介绍一下:
- 自 JDK 1.5 引入
- 位于源码中(代码+注释+注解),使用其他工具进行处理的标签
- 提供了额外的程序,增加了自由度,迅速被广大框架所接受
- 已经成为各种框架程序的标配
- 程序员需要了解并熟练使用各种框架提供的新注解
具体例子如下:
Servlet 3.0 的 配置
- Servlet 是 JavaEE最重要的元素
- 传统是需要在 web.xml 里面配置,3.0 以后支持注解配置,更简便
- 需要容器的支持, Tomcat 7.0 + 支持注解 Servlet 语法
<servlet>
<servlet-name>TestServlet</servlet-name>
<servlet-class>com.test.TestServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>TestServlet</servlet-name>
<servlet-pattern>/TestServlet</servlet-pattern>
</servlet-mapping>
#通过注解的配置
@WebServlet("/TestServlet")
public class TestServlet extends HttpServlet{
//doPost
//doGet
}
Junit 框架
- 只有加 @Test 注解的方法,框架会去执行
- 主要思想是把程序通过判断把加注解的方法都拿出来,然后执行
- 主要通过反射 和 注解 结合实现,比较简单
Spring h & SpringBoot 框架
- @RestControll 或者 @RequestMapping()
-@ SpringBootApplication
Lombok
- https://projectlombok.org/
- 一个能够嵌入IDE工具中的 Java 库
- 提供很多注解,用来消除冗长的代码
@Data
@AllArgsConstructor
public class Student(){
private String name;
private int age;
}
public static void main(String []args){
Student student = new Student("Tom",20);
System.out.println(student.getName());
System.out.println(student.geAge());
}