@Deprecated 注解 (@Documented 、@Retention、@Target)

本是古典 何须时尚 2023-07-15 03:57 52阅读 0赞

前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家。点击跳转到教程。

// 在看 Unsafe 类源码时看到一个注解:@Deprecated,似曾相识…

watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3UwMTEzMTQ0NDI_size_16_color_FFFFFF_t_70

@Deprecated

用在类或者方法上,表示对应代码不推荐使用、已经过时。

通常是因为它是危险的,或者是因为存在更好的替代方案。编译器在非弃用代码中使用或重写弃用的程序元素时发出警告。

调用时可能会出现删除线。

补充:

watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3UwMTEzMTQ0NDI_size_16_color_FFFFFF_t_70 1

@Documented

有此注解的内容将由javadoc和类似工具记录。如果用文档对类型声明进行了注释,则其注释将成为注释元素的公共API的一部分。

watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3UwMTEzMTQ0NDI_size_16_color_FFFFFF_t_70 2

@Retention

@Retention 是一个元注解,即注解上的注解。
它只有一个 RetentionPolicy 类型的属性,RetentionPolicy是一个枚举,共有3个值:SOURCE、CLASS、RUNTIME。

这 3 个值决定了被@Retention所注解的注解(即@Deprecated )被保留的方式。

watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3UwMTEzMTQ0NDI_size_16_color_FFFFFF_t_70 3

1、RetentionPolicy.SOURCE:注解只保留在源文件,当Java文件编译成class文件的时候,注解被遗弃;
2、RetentionPolicy.CLASS:注解被保留到class文件,但jvm加载class文件时候被遗弃,这是默认的生命周期;
3、RetentionPolicy.RUNTIME:注解不仅被保存到class文件中,jvm加载class文件之后,仍然存在;
这3个生命周期分别对应于:Java源文件(.java文件) —-> .class文件 —-> 内存中的字节码。
那怎么来选择合适的注解生命周期呢?
首先要明确生命周期长度 SOURCE < CLASS < RUNTIME ,所以前者能作用的地方后者一定也能作用。
一般如果需要在运行时去动态获取注解信息,那只能用 RUNTIME 注解,比如@Deprecated使用RUNTIME注解
如果要在编译时进行一些预处理操作,比如生成一些辅助代码(如 ButterKnife),就用 CLASS注解;
如果只是做一些检查性的操作,比如 @Override 和 @SuppressWarnings,使用SOURCE 注解。

以上 9 行出自:https://www.cnblogs.com/liufei1983/p/9987084.html

#

@Target

限制注解可以应用于哪种Java元素类型。只有一个枚举数组类型的属性:value。

watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3UwMTEzMTQ0NDI_size_16_color_FFFFFF_t_70 4

用法如:

  1. @Target(value={CONSTRUCTOR, FIELD, LOCAL_VARIABLE, METHOD, PACKAGE, PARAMETER, TYPE})
  2. 数组中的值为注解的作用目标。在此,即:CONSTRUCTOR, FIELD, LOCAL_VARIABLE, METHOD, PACKAGE, PARAMETER, TYPE
  3. 目标范围枚举值有:接口、类、枚举、注解、字段、枚举的常量、方法、方法参数、构造函数、局部变量、包等。
  4. public enum ElementType {
  5. /** Class, interface (including annotation type), or enum declaration */
  6. TYPE,
  7. /** Field declaration (includes enum constants) */
  8. FIELD,
  9. /** Method declaration */
  10. METHOD,
  11. /** Formal parameter declaration */
  12. PARAMETER,
  13. /** Constructor declaration */
  14. CONSTRUCTOR,
  15. /** Local variable declaration */
  16. LOCAL_VARIABLE,
  17. /** Annotation type declaration */
  18. ANNOTATION_TYPE,
  19. /** Package declaration */
  20. PACKAGE,
  21. /**
  22. * Type parameter declaration
  23. *
  24. * @since 1.8
  25. */
  26. TYPE_PARAMETER,
  27. /**
  28. * Use of a type
  29. *
  30. * @since 1.8
  31. */
  32. TYPE_USE
  33. }

参考:

https://blog.csdn.net/fengcai0123/article/details/90544338

https://www.cnblogs.com/liufei1983/p/9987084.html

发表评论

表情:
评论列表 (有 0 条评论,52人围观)

还没有评论,来说两句吧...

相关阅读

    相关 @Deprecated注解功能

    昨天看阿里的java开发手册,其中有一个OOP规约(网上百度了一下,这个规约是阿里自己制定的),其中有一条: 外部正在调用或者二方库依赖的接口,不允许修改方法签名,避

    相关 @Deprecated注解功能

     昨天看阿里的java开发手册,其中有一个OOP规约(网上百度了一下,这个规约是阿里自己制定的),其中有:  【强制】对外暴露的接口签名,原则上不允许