注解是告知编译器要做什么事情的说明,在程序中可以对任何元素进行注解,包括Java包、类、构造方法、域、方法、参数以及局部变量。

注解就像修饰符一样,使用时在其前面增加@符号,用于修饰包、类、构造方法、域、方法、参数以及局部变量的声明,这些信息被存在注解的“name=values”键值对中。注解不影响程序代码的运行,无论增加还是删除注解,代码都始终如一的执行。如果希望程序中的注解在运行时起到一定作用,需要通过配套的工具对注解中的信息进行访问和处理,这种工具统称为APT(Annotation Processing Tool,注解处理工具)。

APT注解处理工具负责提取注解中包含的元数据,并会根据这些元数据增加额外功能。注解中元数据的作用有以下三个方面:

  1. 编写文档——通过注解中标识的元数据可以生成doc文档
  2. 代码分析——通过注解中标识元数据对代码进行分析
  3. 编译检查——通过注解中标识的元数据,让编译器能够实现基本的编译检查,例如@Override重写

Java.lang.annotation.Annotation是一个借口,该接口是所有注解类型都要扩展的公共借口,但接口本身不能定义注解类型,且手动扩展该公共接口的接口也不能定义注解类型

基本注解

@Override:用于限定重写父类的方法,使用该注解修饰的方法必须重写父类中的方法,否则会发生编译错误

@Deprecated:用于标记某个元素已过时,当程序使用已过时的类、方法等,编译器会给出警告;

@SuppressWarnings:用于抑制编译警告的发布,允许开发人员取消显示指定的编译器警告

@SafeVarargs:用于抑制“堆污染”警告

@FunctionalInterface:用于指定某个接口必须是函数式接口

@Override注解

@Override注解用于指定方法的重写,强制一个子类必须覆盖父类的方法。使用@Override注解非常简单,就是需要在重写的方法前加@Override修饰,语法格式如下:

@Override
[访问符] 返回类型 重写方法名(){...}

@Override注解只能修饰方法,不能修饰其他程序元素。@Override注解可以帮助程序员避免一些低级错误

@Deprecated注解

@Deprecated注解标示某个程序元素(接口、类、方法等)已过时,使用该注解的语法格式如下

@Deprecatad
//接口、类、方法等程序元素定义

@Deprecated注解的作用与文档注释中的@deprecated标记的作用基本相同,但使用方式不同,@Deprecated无需放在文档注释/**...*/中,而是直接在接口、类或方法前进行修饰。

@SuppressWarnings注解

SuppressWarnings注解允许开发人员控制编译器警告的发布,可以标注在类、字段、方法、参数、构造方法以及局部变量上。@SuppressWarnings注解的语法格式如下

@SuppressWarnins("参数")
//程序元素(包括该元素的所有子元素)

常用值:

all——忽略所有警告

boxing——忽略装箱/拆箱操作所产生的警告

deprecation——忽略@Deprecated注解的已过时类、方法所显示的警告

finally——忽略finally子句无法正常完成的警告

fallthrough——忽略switch程序块中没有使用break的警告

rawtypes——忽略因使用泛型时未限制类型而产生警告

serial——忽略类缺少serialVersionUID的警告

unchecked——忽略未经检查的类型转换警告

unused——忽略已定义但从未使用的警告

@SafeVarargs注解

“堆污染”是将一个不带泛型的变量复制==赋值给一个带泛型的变量,将导致泛型变量污染。下述代码就会发生这种“堆污染”

List list = new ArrayList();  //没有使用泛型限制的集合
list.add(10);                 //未经检查的类型转换,unchecked警告
List<String>ls = list;        //发生堆污染
System.out.println(ls.get(0));//产生ClassCastException异常

如果不希望看到堆污染警告,可以使用下面三种方式来抑制堆污染警告:

  • 使用@SafeVarargs注解修饰引发该警告的方法(推荐)
  • 使用@SuppressWarnins("unchecked")修饰
  • 编译时使用-Xlint:varargs选项
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.Random;public class SafeVarargsDemo {@SafeVarargspublic static void faultyMethod(List<String>... listStrArray){//Java语言不允许创建泛型数组,因此listArray只能被当成List[]处理//此时相当于把List<String>赋给了List,已经发生了“擦除”List[] listArray = listStrArray;//发生堆污染List<Integer>myList = new ArrayList<Integer>();myList.add(new Random().nextInt(100));//把listArray的第一个元素赋为myListlistArray[0] = myList;String s = listStrArray[0].get(0);}public static void main(String[] args) {faultyMethod(Arrays.asList("Hello!"),Arrays.asList("World!"));}
}

上述代码定义了一个faultyMethod()方法,该方法使用可变参数,个数可变的形参相当于数组,但是形参的类型又是泛型,而Java是不支持泛型数组的,因此只能将List<String>...当成List[],从而导致堆污染。此时使用@SafeVarargs注解来修饰FaultyMethod()方法,在调用该方法时不会发出堆污染警告。

@FunctionalInterface注解

@FunctionalInterface注解用于指定某个接口必须是函数式接口(如果一个接口中只有一个抽象方法,则该接口就是函数式接口)

FunctionalInterface注解的使用

@FunctionalInterface
public interface FunctionalInterfaceDemo {static void foo() {System.out.println("foo类方法");}default void bar() {System.out.println("bar默认方法");}void test();//只定义一个抽象方法//void abc(); //再增加一个抽象方法就错了
}

在接口前使用@FunctionalInnterface注解进行修饰,则该接口内只允许定义一个抽象方法;将倒数第二行代码取消注释时,该接口拥有两个抽象方法而导致程序报错。

注解的作用 常用注解相关推荐

  1. Spring注解@NonNull作用 Spring注解@Nullable作用 Spring NonNull 注解作用 Spring Nullable注解作用

    Spring注解@NonNull作用 Spring注解@Nullable作用 Spring NonNull 注解作用 Spring Nullable注解作用 一.概述 在看Spring源码的时候,经常 ...

  2. java常用注解汇总_Spring常用注解汇总

    概述 注释配置相对于 XML 配置具有很多的优势: 它可以充分利用 Java 的反射机制获取类结构信息,这些信息可以有效减少配置的工作.如使用 JPA 注释配置 ORM 映射时,我们就不需要指定 PO ...

  3. swagger注解说明_swagger2常用注解说明

    原文:https://blog.csdn.net/u014231523/article/details/76522486 说明: 1.这里使用的版本:springfox-swagger2(2.4)sp ...

  4. springboot项目中自定义注解的使用总结、java自定义注解实战(常用注解DEMO)

    初学spring的时候使用注解总觉得使用注解很神奇,加一个注解就能实现想要的功能,很好奇,也想自己根据需要写一些自己实现的自定义注解.问题来了,自定义注解到底是什么?肯定会有人和我一样有这个疑惑,我根 ...

  5. Spring的常用注解,SpringMVC常用注解

    spring注解 作用 IOC @Component 进行标注,所有层通用 @Repository 用于dao层实现类进行标注 @Service 用于Service层实现类进行标注 @Controll ...

  6. spring的各种注解的作用-持续更新中

    所谓的注入到底啥意思? 其实就是spring内部的import 和python里面的import numpy差不多的效果. 依赖注入: 扯白了就是你自己写的对象,需要被spring兼容. 先说说所谓的 ...

  7. Spring常用注解的讲解

    转载,原文链接 作者:字母哥博客 本文出自:springboot深入浅出系列 文章目录 一.常用注解回顾 1.1 @RequestBody与@ResponseBody 1.2. @RequestMap ...

  8. Spring-boot框架常用注解

    springboot的核心就是注解.springboot通过各种组合注解,极大地简化了spring项目的搭建和开发.采用纯java代码,不在需要配置繁杂的xml文件.类型安全对重构可以提供良好的支持. ...

  9. 【Spring 基础注解】对象创建相关注解、注入相关注解、注解扫描详解

    Spring 基础注解(2.x) 注解基础概念 注解的作用 Spring 注解的发展历程 对象创建相关注解 @Component @Repository.@Service.@Contoller @Sc ...

最新文章

  1. linux 线程库在哪里,linux线程库
  2. 全北现代宣布江苏苏宁中后卫洪正好租借延长1年
  3. 005_HttpServlet
  4. c语言乘法口诀倒三角,乘法口诀表,C语言实现
  5. JavaScript面向对象——理解构造函数继承(类继承)
  6. 10年老兵!从大学毕业生到嵌入式系统工程师的修炼之道……
  7. 阿里广告技术最新突破!全链路联动——面向最终目标的全链路一致性建模
  8. 互联网进入智慧互联时代 CSS将推进行业安全生态建设
  9. MySQL 数据库性能优化
  10. 数学建模算法体系分类
  11. 关于绿色校园建设中综合能效平台的管理效益与研究
  12. 有哪些管理类书籍值得推荐?
  13. 统计相关系数(1)——Pearson(皮尔逊)相关系数及MATLAB实现
  14. Keil工程窗口各项图标描述
  15. 浅谈领导力理解和体会
  16. [2020.12.6 解决docker容器乱码问题] 一劳永逸export env LANG=C.UTF-8永久支持中文,无需Dockerfile重建镜像
  17. JavaScript 鼠标移动事件
  18. swiper——自动轮播
  19. 深度拆解:体验好、满意度高,客户为什么不复购的内在逻辑
  20. dede织梦后台页面及功能修改及精简操作方法

热门文章

  1. 分布式ssh_使用SSH的分布式管理
  2. 10.30系统进程及服务控制,前后台调用,kill,进程信号,top进程动态监控,系统控制systemctl,ssh服务和认证,用户登陆审计
  3. CAD如何输入指定角度的直线、AUTOCAD——渐变填充
  4. Minecraft 1.19.2 Forge模组开发 05.矿石生成
  5. 12款好用的Visual Studio插件,最后一款良心推荐
  6. 「云计算」全球最大的5家云计算公司
  7. 【npm】tunneling socket could not be established
  8. 如何更改AD域安全策略-密码必须符合复杂性要求
  9. 【Andrew Gelman多元统计】(基于R)
  10. excel表格内容合并的技巧?