Java中的注解与注解处理器

 更新时间:2023年11月06日 08:59:49   作者:骑个小蜗牛  
这篇文章主要介绍了Java中的注解与注解处理器,元注解的作用是负责注解其他注解, Java5.0定义了4个标准的meta-annotation(元注解)类型,它们被用来提供对其它注解类型进行说明,需要的朋友可以参考下

元注解

元注解的作用是负责注解其他注解。 Java5.0定义了4个标准的meta-annotation(元注解)类型,它们被用来提供对其它注解类型进行说明。

@Target

注解的作用目标,可以在哪些地方使用该注解。

注解的属性

属性名称属性类型属性默认值属性描述
valueElementType[]注解的作用目标元素类型枚举集合

ElementType枚举的取值

  • TYPE:类,接口、枚举、注解
  • FIELD:字段、枚举的常量
  • METHOD:方法
  • PARAMETER:参数
  • CONSTRUCTOR:构造器
  • LOCAL_VARIABLE:局部变量
  • ANNOTATION_TYPE:注解
  • PACKAGE:包

@Retention

注解的保留策略,注解何种情况下仍然存在。

注解的属性

属性名称属性类型属性默认值属性描述
valueRetentionPolicy注解的保留策略

RetentionPolicy枚举的取值

  • SOURCE:源文件中存在,编译后的Class文件不存在
  • CLASS:源文件、Class文件中存在,运行时不存在
  • RUNTIME:源文件、Class文件、运行时都存在,所以可以在运行中通过反射获取到注解信息

@Documented

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

@Inherited

允许子类继承父类中的注解。如果一个使用了@Inherited 修饰的注解被用于一个类,则这个注解也将被用于该类的子类。

内置注解

@Override

指明被注解修饰的方法是覆写父类中的方法。

如果某个方法使用了该注解,却没有覆写父类中的方法,编译器就会生成一个错误。

在子类中覆写父类或接口的方法的过程中,@Overide其实并不是必须的。但是还是建议使用这个注解。如果加了@Overide注解,在你没有正确覆写父类方法的情况下,编译器会有错误提示信息。

覆写失败的情况举例

  • 子类方法的大小写写错了、或者参数错了、或者是子类自己定义的方法;
  • 修改了父类的方法的名字,那么之前重写的子类方法将不再属于重写。

@Deprecated

指明被注解修饰的类、方法、变量等不建议使用。

当编译器遇到了使用@Deprecated修饰的类、方法、变量等时会提示相应的警告信息。

@Suppresswarnings

关闭编译器生成的警告信息。可以修饰类、方法、变量等。

它可以达到抑制编译器编译时产生警告的目的,使用@SuppressWarnings注解,采用就近原则,比如一个方法出现警告,尽量使用@SuppressWarnings注解这个方法,而不是注解方法所在的类。所属范围越小越好,因为范围大了,不利于发现该类下其他方法的警告信息。

但是不太建议使用@SuppressWarnings注解,使用此注解,开发人员看不到编译时编译器提示的相应的警告,不能选择更好、更新的类、方法或者不能编写更规范的编码。同时后期更新JDK、jar包等源码时,使用@SuppressWarnings注解的代码可能受新的JDK、jar包代码的支持,出现错误,仍然需要修改。

注解处理器

注解处理器(Annotation Processor Tool)简称APT,它是用于注解处理的命令行程序,它可以找到源码中对应注解的对象并使用注解处理器对其进行处理。

Java中有默认的注解处理器,使用者也可以自定义注解处理器,注册后使用注解处理器处理注解,最终达到注解本身起到的效果。

注解处理器的原理就是:在需要使用的元素上(类、变量、方法、参数等)加上注解,然后在编译时把使用了这个注解的元素都收集起来,做统一的处理。不管是运行时注解还是编译时注解,都会通过处理器在编译时进行扫描和处理注解。

注解处理器将标记了注解的类,变量等作为输入内容,经过注解处理器处理,生成想要生成的java代码。所以处理器可以理解为就是一个生成代码的工具,只是是通过注解的规则生成。生成后的代码,可以看作是同一般代码,最终被编译。

读取注解

读取注解的核心是java.lang.reflect.AnnotatedElement接口。该接口用于获取类、方法、字段等的注解信息。

实现了这个接口的实现类的实例对象代表了在当前JVM中的一个“被注解元素”。使用这个接口中声明的方法可以读取(通过Java的反射机制)“被注解元素”的注解。

这个接口中的所有方法返回的注解都是不可变的、并且都是可序列化的。因此这个接口中所有方法返 回的数组可以被调用者修改,而不会影响其返回给其他调用者的数组。

接口的常用方法

  • default boolean isAnnotationPresent(Class<? extends Annotation> annotationClass)

判断该元素是否存在指定类型的注解,存在返回true,否则返回false。注意:此方法会忽略注解对应的注解容器。

  • <T extends Annotation> T getAnnotation(Class<T> annotationClass)

返回该元素上存在的指定类型的注解,如果该类型注解不存在,则返回null。

  • Annotation[] getAnnotations()

返回该元素上存在的所有注解,若没有注解,返回空数组。

  • default <T extends Annotation> T[] getAnnotationsByType(Class\<T> annotationClass)

返回元素上存在的指定类型的注解数组,没有注解对应类型的注解时,返回空数组。

该方法的调用者可以随意修改返回的数组,而不会对其他调用者返回的数组产生任何影响。

该方法与getAnnotation的区别在于:getAnnotationsByType会检测注解对应的重复注解容器。若该元素为类,当前类上找不到注解,且该注解为可继承的,则会去父类上检测对应的注解。

  • default <T extends Annotation> T getDeclaredAnnotation(Class\<T> annotationClass)

返回该元素上直接存在的指定类型的注解,如果该类型注解不存在,则返回null。

该方法与此接口中的其他方法有所不同,该方法会忽略继承的注解。如果注解没有直接存在于此元素上,而是存在于元素的父类上,也会返回null。

  • default <T extends Annotation> T[] getDeclaredAnnotationsByType(Class\<T> annotationClass)

返回元素上存在的指定类型的注解数组,没有注解对应类型的注解时,返回空数组。该方法会忽略继承的注解。

  • Annotation[] getDeclaredAnnotations()

返回该元素上存在的所有注解,若没有注解,返回空数组。该方法将忽略继承的注解。

接口的部分实现类

  • AccessibleObject:可访问对象,如:方法、构造器、属性等
  • Class:类
  • Constructor:构造器
  • Executable:可执行的,如:构造器、方法
  • Field:属性
  • Method:方法
  • Package:包
  • Parameter:参数

接口的部分子接口

  • AnnotatedArrayType :被注解的数组类型
  • AnnotatedParameterizedType :被注解的参数化类型
  • AnnotatedType :被注解的类型
  • AnnotatedTypeVariable :被注解的类型变量
  • AnnotatedWildcardType :被注解的通配类型
  • GenericDeclaration :通用声明,用于表示声明型元素,如:类、方法、构造器等
  • TypeVariable<D> :类型变量

到此这篇关于Java中的注解与注解处理器的文章就介绍到这了,更多相关Java注解处理器内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • Spring-cloud-eureka使用feign调用服务接口

    Spring-cloud-eureka使用feign调用服务接口

    这篇文章主要为大家详细介绍了Spring-cloud-eureka使用feign调用服务接口,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2019-04-04
  • Java 网络编程之 TCP 实现简单的聊天系统

    Java 网络编程之 TCP 实现简单的聊天系统

    这篇文章主要介绍了Java 网络编程之 TCP 实现简单的聊天系统,帮助大家更好的理解和学习Java 网络编程,感兴趣的朋友可以了解下
    2020-11-11
  • MyBatis-Plus updateById更新不了空字符串或null的解决方法

    MyBatis-Plus updateById更新不了空字符串或null的解决方法

    本文主要介绍了MyBatis-Plus updateById更新不了空字符串或null的解决方法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2023-03-03
  • Spring Boot中的属性绑定的实现

    Spring Boot中的属性绑定的实现

    这篇文章主要介绍了Spring Boot中的属性绑定的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2019-04-04
  • IDEA JAVA项目热加载的实现步骤

    IDEA JAVA项目热加载的实现步骤

    热加载可以使代码修改后无须重启服务器,就可以加载更改的代码,本文主要介绍了IDEA JAVA项目热加载的实现步骤,具有一定的参考价值,感兴趣的可以了解一下
    2023-06-06
  • Java中的ThreadLocal线程变量详解

    Java中的ThreadLocal线程变量详解

    这篇文章主要介绍了Java中的ThreadLocal线程变量详解,ThreadLocal叫做线程变量,意思是在ThreadLocal中填充的变量属于当前线程,该变量对其他线程而言是隔离的,它是用来提供线程内部的局部变量,需要的朋友可以参考下
    2024-01-01
  • 分享Java8中通过Stream对列表进行去重的实现

    分享Java8中通过Stream对列表进行去重的实现

    本文主要介绍了分享Java8中通过Stream对列表进行去重的实现,包括两种方法,具有一定的参考价值,感兴趣的可以了解一下
    2023-11-11
  • JAVA并发编程有界缓存的实现详解

    JAVA并发编程有界缓存的实现详解

    这篇文章主要介绍了JAVA并发编程有界缓存的实现详解的相关资料,这里举例说明如何实现,四种方法一一代码实现,需要的朋友可以参考下
    2016-12-12
  • MongoDB中ObjectId的误区及引起的一系列问题

    MongoDB中ObjectId的误区及引起的一系列问题

    这篇文章主要介绍了MongoDB中ObjectId的误区及引起的一系列问题,非常不错,具有参考借鉴价值,需要的朋友可以参考下
    2016-12-12
  • java实现策略模式使用示例

    java实现策略模式使用示例

    在使用图像处理软件处理图片后,需要选择一种格式进行保存。然而各种格式在底层实现的算法并不相同,这刚好适合策略模式。编写程序,演示如何使用策略模式与简单工厂模式组合进行开发
    2014-02-02

最新评论