Marvel-Site Marvel-Site
首页
  • Java

    • Java基础
    • Java进阶
    • Java容器
    • Java并发编程
    • Java虚拟机
  • 计算机基础

    • 数据结构与算法
    • 计算机网络
    • 操作系统
    • Linux
  • 框架|中间件

    • Spring
    • MySQL
    • Redis
    • MQ
    • Zookeeper
    • Git
  • 架构

    • 分布式
    • 高并发
    • 高可用
    • 架构
  • 框架

    • React
    • 其他
  • 实用工具
  • 安装配置

    • Linux
    • Windows
    • Mac
  • 开发工具

    • IDEA
    • VsCode
  • 关于
  • 收藏
  • 草稿
  • 索引

    • 分类
    • 标签
    • 归档
GitHub (opens new window)

Marvel

吾必当乘此羽葆盖车
首页
  • Java

    • Java基础
    • Java进阶
    • Java容器
    • Java并发编程
    • Java虚拟机
  • 计算机基础

    • 数据结构与算法
    • 计算机网络
    • 操作系统
    • Linux
  • 框架|中间件

    • Spring
    • MySQL
    • Redis
    • MQ
    • Zookeeper
    • Git
  • 架构

    • 分布式
    • 高并发
    • 高可用
    • 架构
  • 框架

    • React
    • 其他
  • 实用工具
  • 安装配置

    • Linux
    • Windows
    • Mac
  • 开发工具

    • IDEA
    • VsCode
  • 关于
  • 收藏
  • 草稿
  • 索引

    • 分类
    • 标签
    • 归档
GitHub (opens new window)
  • Java

    • Java基础

      • Java基本概念与常识
      • Java基本语法
      • Java基本数据类型
      • Java包装类
      • Java基本概念对比辨析
      • Java面向对象基础
      • Java异常处理
      • Java注解
        • 1. 概述
        • 2. 示例
          • 2.1 生成文档的相关的注解
          • 2.2 在编译时进行格式检查
          • 2.3 跟踪代码依赖性,替代配置文件
        • 3. 元注解
          • 3.1 Retention
          • 3.2 Target
          • 3.3 Documented
          • 3.4 Inherited
        • 4. 通过反射获取注解
      • Java泛型
      • Java反射
      • Java函数式编程
    • Java进阶

    • Java容器

    • Java并发编程

    • Java虚拟机

    • 常见面试题

  • 计算机基础

  • 框架|中间件

  • 架构

  • 后端
  • Java
  • Java基础
Marvel
2022-08-31
目录

Java注解

# Java注解

# 1. 概述

注解(Annotaion)是代码中的特殊标记,这些标记可以在编译,类加载,运行时被读取,并执行响应的处理。通过使用注解,可以在不改变原有逻辑的情况下,在源文件中嵌入一些补充信息。代码分析工具、开发工具和部署工具可以通过这些补充信息进行验证或者进行部署。

注解可以像修饰符一样被使用,可用于修饰以下类型:包、类、构造器、方法、成员变量、参数、局部变量的声明

这些信息保存在 Annotation 的name=value对中。

框架基本上都是基于注解的,框架 = 注解 + 反射 + 设计模式

使用注解时要在前面增加@符号,并把 Annotation 当成一个修饰符使用。

# 2. 示例

# 2.1 生成文档的相关的注解

  • @author 标明开发该类模块的作者,多个作者之间使用,分割
  • @version 标明该类模块的版本
  • @see 参考转向,也就是相关主题
  • @since 从哪个版本开始增加的
  • @param 对方法中某参数的说明,如果没有参数就不能写
  • @return 对方法返回值的说明,如果方法的返回值类型是 void 就不能写
  • @exception 对方法可能抛出的异常进行说明 ,如果方法没有用 throws 显式抛出的异常就不能写

说明

  • @param @return 和 @exception 这三个标记都是只用于方法的。
  • @param 的格式要求:@param 形参名 形参类型 形参说明
  • @return 的格式要求:@return 返回值类型 返回值说明
  • @exception 的格式要求:@exception 异常类型 异常说明
  • @param 和 @exception 可以并列多个

案例

package com.annotation.javadoc;

/**
* @author shkstart
* @version 1.0
* @see Math.java
*/
public class JavadocTest {
	/**
	* 程序的主方法,程序的入口
	* @param args String[] 命令行参数
	*/
	public static void main(String[] args) {
	
	}
	/**
	* 求圆面积的方法
	* @param radius double 半径值
	* @return double 圆的面积
	*/
	public static double getArea(double radius){
		return Math.PI * radius * radius;
	}
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24

# 2.2 在编译时进行格式检查

  • @Override:限定重写父类方法, 该注解只能用于方法。(在编译时会校验是否为重写的方法,如果不是重写的方法会报错)
  • @Deprecated:用于表示所修饰的元素(类, 方法等)已过时。通常是因为所修饰的结构危险或存在更好的选择
  • @SuppressWarnings:抑制编译器警告
@SuppressWarnings("unused") // 经过元素未被使用
@SuppressWarnings({"unused", "rawtypes"}) // 未指定泛型
1
2
字段参数 警告类型含义
all 抑制所有警告
boxing 抑制与装箱/拆箱操作相关的警告
cast 抑制与类型转换操作相关的警告
dep-ann 抑制与已弃用注解相关的警告
deprecation 抑制与已弃用代码相关的警告
fallthrough 抑制与switch语句中缺少break语句相关的警告
finally 抑制与finally块中缺少返回语句相关的警告
hiding 抑制与局部变量隐藏变量相关的警告
incomplete-switch 抑制与switch语句中缺少枚举项相关的警告
nls 抑制与非NLS字符串字面量相关的警告
null 抑制与空指针分析相关的警告
restriction 抑制与使用不推荐或禁止的引用相关的警告
serial 抑制与可序列化类缺少serialVersionUID字段相关的警告
static-access 抑制与静态访问错误相关的警告
synthetic-access 抑制与内部类未优化访问相关的警告
unchecked 抑制与未检查操作相关的警告
unqualified-field-access 抑制与字段访问错误相关的警告
unused 抑制与未使用代码相关的警告

# 2.3 跟踪代码依赖性,替代配置文件

跟踪代码依赖性,实现替代配置文件功能:

⭐ 案例一:Servlet3.0提供了注解(annotation),使得不再需要在web.xml文件中进行Servlet的部署。

用第1行代码替代了web.xml中的配置。

@WebServlet("/login")
public class LoginServlet extends HttpServlet {
	private static final long serialVersionUID = 1L;
	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { 

	}
	protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { 
		doGet(request, response);
	} 
}
1
2
3
4
5
6
7
8
9
10

使用注解后,就不需要再web.xml中配置这些信息了。

<servlet>
	<servlet-name>LoginServlet</servlet-name>
	<servlet-class>com.servlet.LoginServlet</servlet-class>
</servlet>
<servlet-mapping>
	<servlet-name>LoginServlet</servlet-name>
	<url-pattern>/login</url-pattern>
</servlet-mapping>
1
2
3
4
5
6
7
8

⭐ 案例二:spring框架中关于“事务”的管理

@Transactional(propagation=Propagation.REQUIRES_NEW,isolation=Isolation.READ_COMMITTED,readOnly=false,timeout=3)
public void buyBook(String username, String isbn) {
	//1.查询书的单价
	int price = bookShopDao.findBookPriceByIsbn(isbn);
	//2. 更新库存
	bookShopDao.updateBookStock(isbn);
	//3. 更新用户的余额
	bookShopDao.updateUserAccount(username, price);
}
1
2
3
4
5
6
7
8
9
<!-- 配置事务属性 -->
<tx:advice transaction-manager="dataSourceTransactionManager" id="txAdvice">
	<tx:attributes>
		<!-- 配置每个方法使用的事务属性-->
		<tx:method name="buyBook" propagation="REQUIRES_NEW" isolation="READ_COMMITTED" read-only="false" timeout="3" />
	</tx:attributes>
</tx:advice>
1
2
3
4
5
6
7

# 3. 元注解

JDK的元注解(meta-annotation)是用于修饰其他注解(Annotation)而定义的。

  • Retention
  • Target
  • Documented
  • Inherited

# 3.1 Retention

只能用于修饰一个 Annotation 定义,用于指定该 Annotation 的生命周期。

@Rentention 包含一个 RetentionPolicy 类型的成员变量, 使用 @Rentention 时必须为该 value 成员变量指定值:

RetentionPolicy.SOURCE:在源文件中有效(即源文件保留),编译器直接丢弃这种策略的注释。

RetentionPolicy.CLASS:在class文件中有效(即class保留),当运行 Java 程序时,JVM不会保留注解。(默认值)

RetentionPolicy.RUNTIME:在运行时有效(即运行时保留),当运行 Java 程序时,JVM会保留注释。程序可以通过反射获取。 在这里插入图片描述

# 3.2 Target

@Target: 用于修饰 Annotation 定义,用于指定被修饰的 Annotation 能用于修饰哪些程序元素。 @Target 也包含一个名为 value 的成员变量。

取值 ElementType 描述
CONSTRUCTOR 用于描述构造器
FIELD 用于描述域
LOCAL_VARIABLE 用于描述局部变量
METHOD 用于描述方法
PACKAGE 用于描述包
PARAMETER 用于描述参数
TYPE 用于描述类、接口、注解、枚举类等

# 3.3 Documented

@Documented: 用于指定被该元 Annotation 修饰的 Annotation 类将被 javadoc 工具提取成文档。默认情况下,javadoc 是不包括注解的。

定义为 Documented 的注解必须设置 Retention 值为 RUNTIME。

# 3.4 Inherited

@Inherited: 被它修饰的 Annotation 将具有继承性。如果某个类使用了被 @Inherited 修饰的 Annotation,则其子类将自动具有该注解。

如果把标有 @Inherited 注解的自定义的注解标注在类级别上,子类则可以继承父类类级别的注解。实际应用中,使用较少。

# 4. 通过反射获取注解

public void test(){
	Class clazz = Student.class;
	Annotation[] annotations = clazz.getAnnotations();
	for (int i=0; i < annotations.length; i++) {
		System.out.println(annotations[i]);
	}
}
1
2
3
4
5
6
7
编辑 (opens new window)
上次更新: 2023/11/03, 17:50:42
Java异常处理
Java泛型

← Java异常处理 Java泛型→

最近更新
01
位运算
05-21
02
二叉树
05-12
03
Spring三级缓存解决循环依赖
03-25
更多文章>
Theme by Vdoing | Copyright © 2022-2024 Marvel
  • 跟随系统
  • 浅色模式
  • 深色模式
  • 阅读模式