玩转Java注解:元注解、内置注解、自定义注解的原理和实现
点击关注公众号,实用技术文章及时了解
来源:www.jianshu.com/p/ddd0b880641a
前言
Java 注解(Annotation)又称 Java 标注,是 JDK5.0 引入的一种注释机制。重点:和 Javadoc 不同,Java 标注可以通过反射获取标注内容。
大话空话不用说太多,简而言之,在编译器生成类文件时,标注 可以被嵌入到字节码中。Java 虚拟机可以保留标注内容,在运行时可以获取到标注内容 。当然它也支持自定义 Java 标注。反射+注解,是不是感觉Java变成一种动态语言?哈哈哈!
我觉得注解可以分为三个部分来讲:内置注解,元注解,自定义注解。
一、内置注解
1、@Override 重写
概念:检查该方法是否是重写方法。如果发现其父类,或者是引用的接口中并没有该方法时,会报编译错误。
//这个extends 不要在意,我写上去只是为了更加方便直观的去理解,Object是万物之源,不写也会默认是其子类,不用解释过多吧?
public class Annotation1 extends Object{@Overridepublic String toString (){return "我是重新定义过的toString方法";}
}
@Override(重写),这个大家应该很熟悉,重写父类的方法。我们可以看下Object类中toString()是什么样子的。
那么显而易见,使用了@Override(重写)注解,方法名、方法参数必须得和父类保持一致,否则会报错。如下图所示:
如果不加@Override(重写)注解,则正常编译。
2、@Deprecated 过期警告
概念:标记过时方法。如果使用该方法,会报编译警告。在开发中,我们经常能遇到这样的情况,如下图:
在jdk中有大量这样的方法,我就不举例了,自己写一个可能会更加方便理解。
public class Annotation1 extends Object{public static void main(String[] args) {testDeprecated.toString1();}
}
class testDeprecated {@Deprecatedpublic static String toString1(){return "我是重新定义过的toString方法";}
}
注意点:这个不是报错,只是警告,提醒我们这个方法可能会有问题,可能有更好的方法来实现!
3、@SuppressWarnings 忽略警告
概念:指示编译器去忽略注解中声明的警告。
平时开发中,我们会遇到这样的情况,如下图:
这也不是错误,这是提醒我们,该方法没有使用到,警告提醒的作用。加上@SuppressWarnings注解后。
public class Annotation1 extends Object{public static void main(String[] args) {}@SuppressWarnings("all")public static void testSuppressWarnings(){System.out.println("测试+testSuppressWarnings忽略警告!");}
}
方法成功高亮起来,并且没有警告提示了!
我们可以点进去看下这个注解为什么需要参数?
看这里,这个不是方法哦,这是参数。
在注解中的参数格式:calss + 参数名 + ()!这个需要强行记忆哦,回头我们自定义注解时也需要用到。换一种写法加深理解!如下图:
注意点:当注解中只有一个参数时,我们无需加上参数名,注解会自动帮我们匹配的。
二、元注解
概念:顾名思义,元注解就是给注解使用的注解!
1、@Retention 作用域-(常用)
概念:表示在什么级别保存该注解信息。在实际开发中,我们一般都写RUNTIME,除非项目有特殊需求!我们看下@Retention的源码。
可以看到,需要一个参数,进参数瞅瞅。
SOURCE:源代码时有用。
CLASS:class文件中有用,但会被jvm丢弃。
RUNTIME:运行时有用。
关系:RUNTIME>CLASS>SOURCE
后面我们自定义注解时,每个都需要用该注解!
2、@Documented 作用文档
概念:将此注解包含在 javadoc 中 ,它代表着此注解会被javadoc工具提取成文档。
老规矩看下源码:
无参的注解,作用域为RetentionPolicy.RUNTIME
,运行时有用!这个只是用来作为标记,了解即可,在实际运行后会将该注解写入javadoc中,方便查看。
3、@Target 目标-(常用)
概念:标记这个注解应该是使用在哪种 Java 成员上面!
参数源码:
注意这里是数组格式的参数,证明可以传多个值。
@Target(ElementType.TYPE)
——接口、类、枚举、注解@Target(ElementType.FIELD)
——字段、枚举的常量@Target(ElementType.METHOD)
——方法@Target(ElementType.PARAMETER)
——方法参数@Target(ElementType.CONSTRUCTOR)
——构造函数@Target(ElementType.LOCAL_VARIABLE)
——局部变量@Target(ElementType.ANNOTATION_TYPE)
——注解@Target(ElementType.PACKAGE)
——包
我们来试一下:
目标不对会报错的哦!我们将其改成方法上!编译即正常通过。
其他的作用域大家可以去自行尝试,篇幅问题,无法做到每个都去试一遍!
4、@Inherited 继承
概念:标记这个注解是继承于哪个注解类(默认 注解并没有继承于任何子类)。
这个很简单,就是当@InheritedAnno注解加在某个类A上时,假如类B继承了A,则B也会带上该注解。
5、新注解-(了解即可)
从 Java 7 开始,额外添加了 3 个注解:
@SafeVarargs
- Java 7 开始支持,忽略任何使用参数为泛型变量的方法或构造函数调用产生的警告。@FunctionalInterface
- Java 8 开始支持,标识一个匿名函数或函数式接口。@Repeatable
- Java 8 开始支持,标识某注解可以在同一个声明上使用多次。
三、自定义注解
我们来定义一个属于自己的注解。
@Retention(value = RetentionPolicy.RUNTIME)
@Target(value = ElementType.METHOD)
@Inherited
@interface myAnnotation {String name() default "";int age() default 18;String like();String IDCard() default "";
}
格式:修饰符(pulic)+ @interface +注解名+ {参数等}
可利用default 设置默认值,设定了默认值后使用注解时不传值也不会报错,反之报错!
我们只需要传没有默认值的参数即可。
如果不传则报错:
总结
主要就是要注意元注解的使用,因为我们自定义注解时必须得用到!其实注解主要配合反射来用,在此就不展开来叙述了。
推荐
主流Java进阶技术(学习资料分享)
Java面试题宝典
加入Spring技术开发社区
PS:因为公众号平台更改了推送规则,如果不想错过内容,记得读完点一下“在看”,加个“星标”,这样每次新文章推送才会第一时间出现在你的订阅列表里。点“在看”支持我们吧!
玩转Java注解:元注解、内置注解、自定义注解的原理和实现相关推荐
- java 多重注解_Java注解-元数据、注解分类、内置注解和自定义注解
大家好,我是乐字节的小乐,上次说过了Java多态的6大特性|乐字节,接下来我们来看看Java编程里的注解. Java注解有以下几个知识点:元数据 注解的分类 内置注解 自定义注解 注解处理器 Serv ...
- JDK注解(内置和自定义)
JDK注解(内置和自定义) 1.内置 @Override:可以确保重写的方法,的确存在与父类.接口中,可以有效避免单词拼错的情况 @Deprecated:给用于提示,该方法由于安全,性能问题等,已经不 ...
- 2字节取值范围_Java注解-元数据、注解分类、内置注解和自定义注解|乐字节
大家好,我是乐字节的小乐,上次说过了Java多态的6大特性|乐字节,接下来我们来看看Java编程里的注解. Java注解有以下几个知识点: 元数据 注解的分类 内置注解 自定义注解 注解处理器 Ser ...
- 我的世界java版使用剑_我的世界:JAVA版藏“私货”内置绝世好剑与神功,你玩的版本有吗...
导语:我的世界:JAVA版藏"私货"内置绝世好剑与神功,你玩的版本有吗! 在我的世界这款游戏中,每件物品都有它自己存在的作用,铁镐挖矿,盔甲防护,却也有一些物品被创作者赋予了奇怪的 ...
- 企业级JAVA快速开发平台, 内置代码生成器 - JavaFast快速开发平台
企业级JAVA快速开发平台, 内置代码生成器 - JavaFast快速开发平台 JavaFast是一款基于代码生成器的智能快速开发平台,可以帮助解决java项目中80%的重复工作,让开发者更多关注业务 ...
- JavaFast技术特点介绍-企业级JAVA快速开发平台, 内置java代码生成器
企业级JAVA快速开发平台, 内置代码生成器 - JavaFast快速开发平台 JavaFast是一款基于代码生成器的智能快速开发平台,可以帮助解决java项目中80%的重复工作,让开发者更多关注业务 ...
- excel导出多重表头utils_Java中注解学习系列教程-4 使用自定义注解实现excel导出...
本文是<Java中注解学习系列教程>第四篇文章也是小案例文章. 自定义注解小案例是:使用自定义注解实现excel导出. Excel导出分析: 有表头.数据值.一般第一行是表头,从第二行 ...
- 注解和反射详细笔记。自定义注解,元注解,内置注解。反射机制,Java Reflection,Java内存分析,反射操作注解,java.lang.reflect.Method,Class
文章目录 注解 什么是注解 内置注解 元注解 自定义注解 反射机制 静态语言 vs 静态语言 Java Reflection 反射相关的主要API Class类 Java内存分析 创建运行时类的对象 ...
- 【Java注解系列】内置注解与AOP实现自定义注解
Java 注解(Annotation)又称 Java 标注,是 JDK5.0 引入的一种注释机制. Java 语言中的类.方法.变量.参数和包等都可以被标注.和 Javadoc 不同,Java 标注可 ...
- apache shiro内置过滤器 标签 注解
内置过滤器 anon(匿名) org.apache.shiro.web.filter.authc.AnonymousFilter authc(身份验证) org.apache.shiro ...
最新文章
- python使用numpy的np.fmod函数计算numpy数组除以某一特定数值剩余的余数(remainder)、np.mod函数和np.fmod函数对负值的处理方式有差异
- pandas 删除 csv 中 unnamed 列
- 如何将html页面上的形状存储,css – html -split一个页面成为所需的形状作为div?...
- Source Insight 3.X 标签插件v1.0发布
- IOS模拟登录之沙盒原理
- Quay (1) - 用Quay Operator配置Quay环境
- vs:严重性代码说明项目文件行错误LNK1168无法打开testes.exe进行写入
- ASCII码对照表(emoji表情符号)
- HTTP请求的完整过程
- 使用PHP 的 curl 爬取 青果教务系统 课表
- 2018蓝桥杯 明码 解题方法
- 【Excel 操作】二维表转一维表的两种方法
- java ee与j2ee_JavaEE/J2EE与J2SE/JDK版本的相关性
- 理不懂,你注定就是穷打工的命 【转】
- SpaceShooter打飞机教程笔记(二)
- 洛必达法则的使用条件
- AcWing - 高斯消元解线性方程组(高斯消元)
- 效果图网站、外包平台接单平台有哪些?
- 变态反应电子病历软件行业调研报告 - 市场现状分析与发展前景预测(2021-2027年)
- 即时通讯整体解决方案
热门文章
- 华为还是输了!双11战报出炉,离苹果仍有距离
- 网友问有没有小米MIX 4 雷军的回应耐人寻味
- 《哪吒》票房破31亿元 超越《药神》升至中国票房榜第七
- 上海特斯拉自燃事件终于有结果了:没有系统缺陷 单个电池模组故障
- 相机翻转设计的华硕旗舰ZenFone 6固件更新:新增“超级夜间模式”
- 新iPhone模具曝光:刘海屏无变化 后置三摄排布辣眼
- 美团点评:摩拜贡献收入15亿元 同期亏损45.5亿元
- 提效80%|一次【Jmeter】实践的接口自动化
- Framework学习(二)Android的启动过程
- html canvas blob image 污染源