0
点赞
收藏
分享

微信扫一扫

Java Annotation 总结

大明宫 2022-03-12 阅读 54

Java Annotation 总结

文章目录

一、

1.1注解: Annotation

  • 从JDK1.5 引入
  • 位于源码中(代码/注解/注释),使用其他工具进行处理的标签
  • 注解用来修饰程序的元素,但不会对被修饰的对象有直接的影响
  • 只有通过某种配套的工具才会对注解信息进行访问和处理
  • 主要用途
    1. 提供信息给编译器 / IDE工具
    2. 可用于其他工具来产生额外的代码 / 配置文件等
    3. 有一些注解可以在程序运行时访问,增加程序的动态性

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());
}
举报

相关推荐

0 条评论