你真的理解Java 注解吗?
2024-09-01 22:51:27
你真的理解Java 注解吗?
1、什么是注解?
官方解释:
Java 注解用于为 Java 代码提供元数据。作为元数据,注解不直接影响你的代码执行,但也有一些类型的注解实际上可以用于这一目的。Java 注解是从 Java5 开始添加到 Java 的。
个人理解:
注解≈标签
2、注解的使用场景?
我们先不谈如何实现注解,我们从需求出发,先看看注解该如何使用。
- 生成文档。这是最常见的,也是java 最早提供的注解。常用的有@param @return 等
- 跟踪代码依赖性,实现替代配置文件功能。比如Dagger 2依赖注入,未来java开发,将大量注解配置,具有很大用处;
- 在编译时进行格式检查。如@override 放在方法前,如果你这个方法并不是覆盖了超类方法,则编译时就能检查出。
3、注解原理
注解本质是一个继承了Annotation的特殊接口,其具体实现类是Java运行时生成的动态代理类。而我们通过反射获取注解时,返回的是Java运行时生成的动态代理对象$Proxy1。通过代理对象调用自定义注解(接口)的方法,会最终调用AnnotationInvocationHandler的invoke方法。该方法会从memberValues这个Map中索引出对应的值。而memberValues的来源是Java常量池。
4、注解类型
- 元注解
- Java 内置注解
- 自定义注解
(1)元注解
- @Retention:描述注解生命周期,例如
@Retention(RetentionPolicy.RUNTIME)
- @Documented:将注解中的元素包含到
Javadoc
文档中 - @Target:限定了注解作用的目标范围,包括类、方法等等
- @Inherited:使得一个 被@Inherited注解的注解 作用的类的子类可以继承该类的注解
- @Repeatable:使得作用的注解可以取多个值(Java1.8)
(2)Java 内置注解
- @Deprecated:标记已过时 & 被抛弃的元素(类、方法等)
- @Override:标记该方法需要被子类复写
- @SuppressWarnings:标记的元素会阻止编译器发出警告提醒 (主要应用于开发者需要忽略警告时)
- @SafeVarargs:提醒开发者不要用参数做不安全的操作 & 阻止编译器产生
unchecked
警告(1.7引入) - @FunctionalInterface:表示该接口 = 函数式接口(1.8引入,例如
Runnable
接口就是使用了该注解)
(3)自定义注解
定义一个注解
// 通过 @interface 关键字进行定义
// 形式类似于接口,区别在于多了一个 @ 符号
public @interface MyAnnotation {
// 注解的属性 = 成员变量
// 注解只有成员变量,没有方法
// 注解@MyAnnotation中有2个属性:id 和 msg
int id();
String msg() default "Hi" ;
// 说明:
// 注解的属性以 “无形参的方法” 形式来声明
// 方法名 = 属性名
// 方法返回值 = 属性类型 = 8 种基本数据类型 + 类、接口、注解及对应数组类型
// 用 default 关键值指定 属性的默认值,如上面的msg的默认值 = ”Hi“
}
Demo地址如下:
https://github.com/Taoey/DAS/tree/master/JavaBase/src/main/java/annotation
最新文章
- Day11-协程/异步IO/RabbitMQ
- java 文件保存到本地
- 对ToString(";X2 ";)的理解
- 使用NPOI从Excel中提取图片及图片位置信息
- MPlayer-2016-bin-noConsole
- (转)新手必看:HighCharts几个基础问答
- 基础DOM和CSS操作(二)
- [Windows]VS2010如何以管理员权限启动?(转)
- [LeetCode#82]Remove Duplicates from Sorted Array II
- vultr vps2016年免费升级流量和cpu
- Linux Shell脚本攻略学习总结:二
- ASCII码表(常用)
- web报表工具FineReport常用函数的用法总结(日期和时间函数)
- Edge-assisted Traffic Engineering and applications in the IoT
- 基于SpringBoot搭建应用开发框架(二) —— 登录认证
- win10关不了机解决办法以及win10怎么禁止开机启动项
- XACT_ABORT选项
- MT【6】等比数列和的极限
- CXF2.7整合spring发布webservice,返回值类型是Map和List<;Map>;类型
- js的with语句,和debugger语句
热门文章
- git 设置和取消指定域名代理 - git config proxy
- B.Silly Mistake
- 使用iCamera 测试MT9F002 1400w高分辨率摄像头小结 之!!看清细节!!!
- JS内置对象-Array之indexOf和lastIndexOf
- fineuploader php服务端
- AI-Azure上的认知服务之Computer Vision(计算机视觉)
- 深入理解 Spring Cloud 核心组件与底层原理
- react---css3动画 react-transition-group的使用
- Python——面向对象(类)的基础疑难点
- python批量插入数据到es和读取es数据