点击关注公众号,实用技术文章及时了解

来源: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注解:元注解、内置注解、自定义注解的原理和实现相关推荐

  1. java 多重注解_Java注解-元数据、注解分类、内置注解和自定义注解

    大家好,我是乐字节的小乐,上次说过了Java多态的6大特性|乐字节,接下来我们来看看Java编程里的注解. Java注解有以下几个知识点:元数据 注解的分类 内置注解 自定义注解 注解处理器 Serv ...

  2. JDK注解(内置和自定义)

    JDK注解(内置和自定义) 1.内置 @Override:可以确保重写的方法,的确存在与父类.接口中,可以有效避免单词拼错的情况 @Deprecated:给用于提示,该方法由于安全,性能问题等,已经不 ...

  3. 2字节取值范围_Java注解-元数据、注解分类、内置注解和自定义注解|乐字节

    大家好,我是乐字节的小乐,上次说过了Java多态的6大特性|乐字节,接下来我们来看看Java编程里的注解. Java注解有以下几个知识点: 元数据 注解的分类 内置注解 自定义注解 注解处理器 Ser ...

  4. 我的世界java版使用剑_我的世界:JAVA版藏“私货”内置绝世好剑与神功,你玩的版本有吗...

    导语:我的世界:JAVA版藏"私货"内置绝世好剑与神功,你玩的版本有吗! 在我的世界这款游戏中,每件物品都有它自己存在的作用,铁镐挖矿,盔甲防护,却也有一些物品被创作者赋予了奇怪的 ...

  5. 企业级JAVA快速开发平台, 内置代码生成器 - JavaFast快速开发平台

    企业级JAVA快速开发平台, 内置代码生成器 - JavaFast快速开发平台 JavaFast是一款基于代码生成器的智能快速开发平台,可以帮助解决java项目中80%的重复工作,让开发者更多关注业务 ...

  6. JavaFast技术特点介绍-企业级JAVA快速开发平台, 内置java代码生成器

    企业级JAVA快速开发平台, 内置代码生成器 - JavaFast快速开发平台 JavaFast是一款基于代码生成器的智能快速开发平台,可以帮助解决java项目中80%的重复工作,让开发者更多关注业务 ...

  7. excel导出多重表头utils_Java中注解学习系列教程-4 使用自定义注解实现excel导出...

    本文是<Java中注解学习系列教程>第四篇文章也是小案例文章. 自定义注解小案例是:使用自定义注解实现excel导出. Excel导出分析: ​ 有表头.数据值.一般第一行是表头,从第二行 ...

  8. 注解和反射详细笔记。自定义注解,元注解,内置注解。反射机制,Java Reflection,Java内存分析,反射操作注解,java.lang.reflect.Method,Class

    文章目录 注解 什么是注解 内置注解 元注解 自定义注解 反射机制 静态语言 vs 静态语言 Java Reflection 反射相关的主要API Class类 Java内存分析 创建运行时类的对象 ...

  9. 【Java注解系列】内置注解与AOP实现自定义注解

    Java 注解(Annotation)又称 Java 标注,是 JDK5.0 引入的一种注释机制. Java 语言中的类.方法.变量.参数和包等都可以被标注.和 Javadoc 不同,Java 标注可 ...

  10. apache shiro内置过滤器 标签 注解

    内置过滤器 anon(匿名)  org.apache.shiro.web.filter.authc.AnonymousFilter authc(身份验证)       org.apache.shiro ...

最新文章

  1. python使用numpy的np.fmod函数计算numpy数组除以某一特定数值剩余的余数(remainder)、np.mod函数和np.fmod函数对负值的处理方式有差异
  2. pandas 删除 csv 中 unnamed 列
  3. 如何将html页面上的形状存储,css – html -split一个页面成为所需的形状作为div?...
  4. Source Insight 3.X 标签插件v1.0发布
  5. IOS模拟登录之沙盒原理
  6. Quay (1) - 用Quay Operator配置Quay环境
  7. vs:严重性代码说明项目文件行错误LNK1168无法打开testes.exe进行写入
  8. ASCII码对照表(emoji表情符号)
  9. HTTP请求的完整过程
  10. 使用PHP 的 curl 爬取 青果教务系统 课表
  11. 2018蓝桥杯 明码 解题方法
  12. 【Excel 操作】二维表转一维表的两种方法
  13. java ee与j2ee_JavaEE/J2EE与J2SE/JDK版本的相关性
  14. 理不懂,你注定就是穷打工的命 【转】
  15. SpaceShooter打飞机教程笔记(二)
  16. 洛必达法则的使用条件
  17. AcWing - 高斯消元解线性方程组(高斯消元)
  18. 效果图网站、外包平台接单平台有哪些?
  19. 变态反应电子病历软件行业调研报告 - 市场现状分析与发展前景预测(2021-2027年)
  20. 即时通讯整体解决方案

热门文章

  1. 华为还是输了!双11战报出炉,离苹果仍有距离
  2. 网友问有没有小米MIX 4 雷军的回应耐人寻味
  3. 《哪吒》票房破31亿元 超越《药神》升至中国票房榜第七
  4. 上海特斯拉自燃事件终于有结果了:没有系统缺陷 单个电池模组故障
  5. 相机翻转设计的华硕旗舰ZenFone 6固件更新:新增“超级夜间模式”
  6. 新iPhone模具曝光:刘海屏无变化 后置三摄排布辣眼
  7. 美团点评:摩拜贡献收入15亿元 同期亏损45.5亿元
  8. 提效80%|一次【Jmeter】实践的接口自动化
  9. Framework学习(二)Android的启动过程
  10. html canvas blob image 污染源