注解的作用 常用注解
注解是告知编译器要做什么事情的说明,在程序中可以对任何元素进行注解,包括Java包、类、构造方法、域、方法、参数以及局部变量。
注解就像修饰符一样,使用时在其前面增加@符号,用于修饰包、类、构造方法、域、方法、参数以及局部变量的声明,这些信息被存在注解的“name=values”键值对中。注解不影响程序代码的运行,无论增加还是删除注解,代码都始终如一的执行。如果希望程序中的注解在运行时起到一定作用,需要通过配套的工具对注解中的信息进行访问和处理,这种工具统称为APT(Annotation Processing Tool,注解处理工具)。
APT注解处理工具负责提取注解中包含的元数据,并会根据这些元数据增加额外功能。注解中元数据的作用有以下三个方面:
- 编写文档——通过注解中标识的元数据可以生成doc文档
- 代码分析——通过注解中标识元数据对代码进行分析
- 编译检查——通过注解中标识的元数据,让编译器能够实现基本的编译检查,例如@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注解进行修饰,则该接口内只允许定义一个抽象方法;将倒数第二行代码取消注释时,该接口拥有两个抽象方法而导致程序报错。
注解的作用 常用注解相关推荐
- Spring注解@NonNull作用 Spring注解@Nullable作用 Spring NonNull 注解作用 Spring Nullable注解作用
Spring注解@NonNull作用 Spring注解@Nullable作用 Spring NonNull 注解作用 Spring Nullable注解作用 一.概述 在看Spring源码的时候,经常 ...
- java常用注解汇总_Spring常用注解汇总
概述 注释配置相对于 XML 配置具有很多的优势: 它可以充分利用 Java 的反射机制获取类结构信息,这些信息可以有效减少配置的工作.如使用 JPA 注释配置 ORM 映射时,我们就不需要指定 PO ...
- swagger注解说明_swagger2常用注解说明
原文:https://blog.csdn.net/u014231523/article/details/76522486 说明: 1.这里使用的版本:springfox-swagger2(2.4)sp ...
- springboot项目中自定义注解的使用总结、java自定义注解实战(常用注解DEMO)
初学spring的时候使用注解总觉得使用注解很神奇,加一个注解就能实现想要的功能,很好奇,也想自己根据需要写一些自己实现的自定义注解.问题来了,自定义注解到底是什么?肯定会有人和我一样有这个疑惑,我根 ...
- Spring的常用注解,SpringMVC常用注解
spring注解 作用 IOC @Component 进行标注,所有层通用 @Repository 用于dao层实现类进行标注 @Service 用于Service层实现类进行标注 @Controll ...
- spring的各种注解的作用-持续更新中
所谓的注入到底啥意思? 其实就是spring内部的import 和python里面的import numpy差不多的效果. 依赖注入: 扯白了就是你自己写的对象,需要被spring兼容. 先说说所谓的 ...
- Spring常用注解的讲解
转载,原文链接 作者:字母哥博客 本文出自:springboot深入浅出系列 文章目录 一.常用注解回顾 1.1 @RequestBody与@ResponseBody 1.2. @RequestMap ...
- Spring-boot框架常用注解
springboot的核心就是注解.springboot通过各种组合注解,极大地简化了spring项目的搭建和开发.采用纯java代码,不在需要配置繁杂的xml文件.类型安全对重构可以提供良好的支持. ...
- 【Spring 基础注解】对象创建相关注解、注入相关注解、注解扫描详解
Spring 基础注解(2.x) 注解基础概念 注解的作用 Spring 注解的发展历程 对象创建相关注解 @Component @Repository.@Service.@Contoller @Sc ...
最新文章
- linux 线程库在哪里,linux线程库
- 全北现代宣布江苏苏宁中后卫洪正好租借延长1年
- 005_HttpServlet
- c语言乘法口诀倒三角,乘法口诀表,C语言实现
- JavaScript面向对象——理解构造函数继承(类继承)
- 10年老兵!从大学毕业生到嵌入式系统工程师的修炼之道……
- 阿里广告技术最新突破!全链路联动——面向最终目标的全链路一致性建模
- 互联网进入智慧互联时代 CSS将推进行业安全生态建设
- MySQL 数据库性能优化
- 数学建模算法体系分类
- 关于绿色校园建设中综合能效平台的管理效益与研究
- 有哪些管理类书籍值得推荐?
- 统计相关系数(1)——Pearson(皮尔逊)相关系数及MATLAB实现
- Keil工程窗口各项图标描述
- 浅谈领导力理解和体会
- [2020.12.6 解决docker容器乱码问题] 一劳永逸export env LANG=C.UTF-8永久支持中文,无需Dockerfile重建镜像
- JavaScript 鼠标移动事件
- swiper——自动轮播
- 深度拆解:体验好、满意度高,客户为什么不复购的内在逻辑
- dede织梦后台页面及功能修改及精简操作方法
热门文章
- 分布式ssh_使用SSH的分布式管理
- 10.30系统进程及服务控制,前后台调用,kill,进程信号,top进程动态监控,系统控制systemctl,ssh服务和认证,用户登陆审计
- CAD如何输入指定角度的直线、AUTOCAD——渐变填充
- Minecraft 1.19.2 Forge模组开发 05.矿石生成
- 12款好用的Visual Studio插件,最后一款良心推荐
- 「云计算」全球最大的5家云计算公司
- 【npm】tunneling socket could not be established
- 如何更改AD域安全策略-密码必须符合复杂性要求
- 【Andrew Gelman多元统计】(基于R)
- excel表格内容合并的技巧?