服务器之家:专注于服务器技术及软件下载分享
分类导航

PHP教程|ASP.NET教程|Java教程|ASP教程|编程技术|正则表达式|C/C++|IOS|C#|Swift|Android|VB|R语言|JavaScript|易语言|vb.net|

服务器之家 - 编程语言 - Java教程 - 玩转Java注解:元注解、内置注解、自定义注解的原理和实现

玩转Java注解:元注解、内置注解、自定义注解的原理和实现

2021-12-30 21:43Java知音 Java教程

Java 注解(Annotation)又称 Java 标注,是 JDK5.0 引入的一种注释机制。重点:和 Javadoc 不同,Java 标注可以通过反射获取标注内容。

前言

Java 注解(Annotation)又称 Java 标注,是 JDK5.0 引入的一种注释机制。重点:和 Javadoc 不同,Java 标注可以通过反射获取标注内容。

大话空话不用说太多,简而言之,在编译器生成类文件时,标注 可以被嵌入到字节码中。Java 虚拟机可以保留标注内容,在运行时可以获取到标注内容 。当然它也支持自定义 Java 标注。反射+注解,是不是感觉Java变成一种动态语言?哈哈哈!

我觉得注解可以分为三个部分来讲:内置注解,元注解,自定义注解。

一、内置注解

1、@Override 重写

概念:检查该方法是否是重写方法。如果发现其父类,或者是引用的接口中并没有该方法时,会报编译错误。

  1. //这个extends 不要在意,我写上去只是为了更加方便直观的去理解,Object是万物之源,不写也会默认是其子类,不用解释过多吧?
  2. public class Annotation1 extends Object{
  3. @Override
  4. public String toString (){
  5. return "我是重新定义过的toString方法";
  6. }
  7. }

@Override(重写),这个大家应该很熟悉,重写父类的方法。我们可以看下Object类中toString()是什么样子的。

玩转Java注解:元注解、内置注解、自定义注解的原理和实现

那么显而易见,使用了@Override(重写)注解,方法名、方法参数必须得和父类保持一致,否则会报错。如下图所示:

玩转Java注解:元注解、内置注解、自定义注解的原理和实现

如果不加@Override(重写)注解,则正常编译。

玩转Java注解:元注解、内置注解、自定义注解的原理和实现

2、@Deprecated 过期警告

概念:标记过时方法。如果使用该方法,会报编译警告。在开发中,我们经常能遇到这样的情况,如下图:

玩转Java注解:元注解、内置注解、自定义注解的原理和实现

在jdk中有大量这样的方法,我就不举例了,自己写一个可能会更加方便理解。

  1. public class Annotation1 extends Object{
  2. public static void main(String[] args) {
  3. testDeprecated.toString1();
  4. }
  5. }
  6. class testDeprecated {
  7. @Deprecated
  8. public static String toString1(){
  9. return "我是重新定义过的toString方法";
  10. }
  11. }

玩转Java注解:元注解、内置注解、自定义注解的原理和实现

注意点:这个不是报错,只是警告,提醒我们这个方法可能会有问题,可能有更好的方法来实现!

3、@SuppressWarnings 忽略警告

概念:指示编译器去忽略注解中声明的警告。

平时开发中,我们会遇到这样的情况,如下图:

玩转Java注解:元注解、内置注解、自定义注解的原理和实现

这也不是错误,这是提醒我们,该方法没有使用到,警告提醒的作用。加上@SuppressWarnings注解后。

  1. public class Annotation1 extends Object{
  2. public static void main(String[] args) {
  3. }
  4. @SuppressWarnings("all")
  5. public static void testSuppressWarnings(){
  6. System.out.println("测试+testSuppressWarnings忽略警告!");
  7. }
  8. }

方法成功高亮起来,并且没有警告提示了!

玩转Java注解:元注解、内置注解、自定义注解的原理和实现

我们可以点进去看下这个注解为什么需要参数?

玩转Java注解:元注解、内置注解、自定义注解的原理和实现

看这里,这个不是方法哦,这是参数。

在注解中的参数格式:calss + 参数名 + ()!这个需要强行记忆哦,回头我们自定义注解时也需要用到。换一种写法加深理解!如下图:

玩转Java注解:元注解、内置注解、自定义注解的原理和实现

注意点:当注解中只有一个参数时,我们无需加上参数名,注解会自动帮我们匹配的。

二、元注解

概念:顾名思义,元注解就是给注解使用的注解!

1、@Retention 作用域-(常用)

概念:表示在什么级别保存该注解信息。在实际开发中,我们一般都写RUNTIME,除非项目有特殊需求!我们看下@Retention的源码。

玩转Java注解:元注解、内置注解、自定义注解的原理和实现

可以看到,需要一个参数,进参数瞅瞅。

玩转Java注解:元注解、内置注解、自定义注解的原理和实现

  • SOURCE:源代码时有用。
  • CLASS:class文件中有用,但会被jvm丢弃。
  • RUNTIME:运行时有用。
  • 关系:RUNTIME>CLASS>SOURCE

后面我们自定义注解时,每个都需要用该注解!

2、@Documented 作用文档

概念:将此注解包含在 javadoc 中 ,它代表着此注解会被javadoc工具提取成文档。

老规矩看下源码:

玩转Java注解:元注解、内置注解、自定义注解的原理和实现

无参的注解,作用域为RetentionPolicy.RUNTIME,运行时有用!这个只是用来作为标记,了解即可,在实际运行后会将该注解写入javadoc中,方便查看。

3、@Target 目标-(常用)

概念:标记这个注解应该是使用在哪种 Java 成员上面!

玩转Java注解:元注解、内置注解、自定义注解的原理和实现

参数源码:

玩转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)——包

我们来试一下:

玩转Java注解:元注解、内置注解、自定义注解的原理和实现

目标不对会报错的哦!我们将其改成方法上!编译即正常通过。

玩转Java注解:元注解、内置注解、自定义注解的原理和实现

其他的作用域大家可以去自行尝试,篇幅问题,无法做到每个都去试一遍!

4、@Inherited 继承

概念:标记这个注解是继承于哪个注解类(默认 注解并没有继承于任何子类)。

玩转Java注解:元注解、内置注解、自定义注解的原理和实现

这个很简单,就是当@InheritedAnno注解加在某个类A上时,假如类B继承了A,则B也会带上该注解。

5、新注解-(了解即可)

从 Java 7 开始,额外添加了 3 个注解:

  • @SafeVarargs - Java 7 开始支持,忽略任何使用参数为泛型变量的方法或构造函数调用产生的警告。
  • @FunctionalInterface - Java 8 开始支持,标识一个匿名函数或函数式接口。
  • @Repeatable - Java 8 开始支持,标识某注解可以在同一个声明上使用多次。

三、自定义注解

我们来定义一个属于自己的注解。

  1. @Retention(value = RetentionPolicy.RUNTIME)
  2. @Target(value = ElementType.METHOD)
  3. @Inherited
  4. @interface myAnnotation {
  5. String name() default "";
  6. int age() default 18;
  7. String like();
  8. String IDCard() default "";
  9. }

格式:修饰符(pulic)+ @interface +注解名+ {参数等}

可利用default 设置默认值,设定了默认值后使用注解时不传值也不会报错,反之报错!

玩转Java注解:元注解、内置注解、自定义注解的原理和实现

我们只需要传没有默认值的参数即可。

如果不传则报错:

玩转Java注解:元注解、内置注解、自定义注解的原理和实现

总结

主要就是要注意元注解的使用,因为我们自定义注解时必须得用到!其实注解主要配合反射来用,在此就不展开来叙述了。

原文地址:https://mp.weixin.qq.com/s/F-I7FofDcbFIDeemtk0bsA

延伸 · 阅读

精彩推荐
  • Java教程升级IDEA后Lombok不能使用的解决方法

    升级IDEA后Lombok不能使用的解决方法

    最近看到提示IDEA提示升级,寻思已经有好久没有升过级了。升级完毕重启之后,突然发现好多错误,本文就来介绍一下如何解决,感兴趣的可以了解一下...

    程序猿DD9332021-10-08
  • Java教程xml与Java对象的转换详解

    xml与Java对象的转换详解

    这篇文章主要介绍了xml与Java对象的转换详解的相关资料,需要的朋友可以参考下...

    Java教程网2942020-09-17
  • Java教程Java实现抢红包功能

    Java实现抢红包功能

    这篇文章主要为大家详细介绍了Java实现抢红包功能,采用多线程模拟多人同时抢红包,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙...

    littleschemer13532021-05-16
  • Java教程小米推送Java代码

    小米推送Java代码

    今天小编就为大家分享一篇关于小米推送Java代码,小编觉得内容挺不错的,现在分享给大家,具有很好的参考价值,需要的朋友一起跟随小编来看看吧...

    富贵稳中求8032021-07-12
  • Java教程Java BufferWriter写文件写不进去或缺失数据的解决

    Java BufferWriter写文件写不进去或缺失数据的解决

    这篇文章主要介绍了Java BufferWriter写文件写不进去或缺失数据的解决方案,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望...

    spcoder14552021-10-18
  • Java教程20个非常实用的Java程序代码片段

    20个非常实用的Java程序代码片段

    这篇文章主要为大家分享了20个非常实用的Java程序片段,对java开发项目有所帮助,感兴趣的小伙伴们可以参考一下 ...

    lijiao5352020-04-06
  • Java教程Java8中Stream使用的一个注意事项

    Java8中Stream使用的一个注意事项

    最近在工作中发现了对于集合操作转换的神器,java8新特性 stream,但在使用中遇到了一个非常重要的注意点,所以这篇文章主要给大家介绍了关于Java8中S...

    阿杜7482021-02-04
  • Java教程Java使用SAX解析xml的示例

    Java使用SAX解析xml的示例

    这篇文章主要介绍了Java使用SAX解析xml的示例,帮助大家更好的理解和学习使用Java,感兴趣的朋友可以了解下...

    大行者10067412021-08-30