注解的优点?元注解?

news/2024/10/11 8:30:32

介绍

注解是JDK1.5版本开始引入的一个特性,用于对代码进行说明,可以对包、类、接口、字段、方法参数、局部变量等进行注解。主要作用如下:

  • 编写文档——通过注解中标识的元数据可以生成doc文档,这是最常见的,也是java 最早提供的注解。常用的有@param @return 等

  • 代码分析——通过注解中标识元数据对代码进行分析。跟踪代码依赖性,实现替代配置文件功能。

  • 编译检查——通过注解中标识的元数据,让编译器能够实现基本的编译检查,例如@Override重写,如果这个方法并不是覆盖了超类方法,则编译时就能检查出。

这么来说是比较抽象的,具体看下注解的常见分类:

  • Java自带的标准注解,包括@Override 、@Deprecated 和 @SuppressWarnings,分别用于标明重写某个方法、标明某个类或方法过时、标明要忽略的警告,用这些注解标明后编译器就会进行检查。

  • 元注解,元注解是用于定义注解的注解,包括@Retention、@Target、@Inherited 和 @Documented;@Retention用于标明注解被保留的阶段,@Target用于标明注解使用的范围,@Inherited用于标明注解可继承,@Documented用于标明是否生成javadoc文档。

  • 自定义注解,可以根据自己的需求定义注解,并可用元注解对自定义注解进行注解。

Java内置注解

Java 1.5开始自带的标准注解,包括@Override、@Deprecated和@SuppressWarnings:

  • @Override :表示当前的方法定义将覆盖父类中的方法

  • @Deprecated:表示代码被弃用,如果使用了被@Deprecated注解的代码则编译器将发出警告

  • @SuppressWarnings:表示关闭编译器警告信息

@Override

@Target(ElementType.METHOD)
@Retention(RetentionPolicy.SOURCE)public @interface Override {
}

从源码中看到,这个注解可以被用来修饰方法,并且它只在编译时有效,在编译后的class文件中便不再存在。这个注解的作用就是告诉编译器被修饰的方法是重写的父类的中的相同签名的方法,编译器会对此做出检查,若发现父类中不存在这个方法或是存在的方法签名不同,则会报错。

@Deprecated

@Documented
@Retention(RetentionPolicy.RUNTIME)
@Target(value={CONSTRUCTOR, FIELD, LOCAL_VARIABLE, METHOD, PACKAGE, PARAMETER, TYPE})public @interface Deprecated {
}

从源码中可以知道,它会被文档化,能够保留到运行时,能够修饰构造方法、属性、局部变量、方法、包、参数、类型。这个注解的作用是告诉编译器被修饰的程序元素已被“废弃”,不再建议用户使用

@SuppressWarnings

@Target({TYPE, FIELD, METHOD, PARAMETER, CONSTRUCTOR, LOCAL_VARIABLE})
@Retention(RetentionPolicy.SOURCE)
public @interface SuppressWarnings {String[] value();
}

它能够修饰的程序元素包括类型、属性、方法、参数、构造器、局部变量,只能存活在源码时,取值为String[]。它的作用是告诉编译器忽略指定的警告信息,它可以取的值如下所示:

元注解

  • @Target:用来限制注解的使用范围

  • @Retention:指定其所修饰的注解的保留策略

  • @Document:该注解是一个标记注解,用于指示一个注解将被文档化

  • @Inherited:该注解使父类的注解能被其子类继承

  • @Repeatable:该注解是Java8新增的注解,用于开发重复注解

  • 类型注解(Type Annotation):该注解是Java8新增的注解,可以用在任何用到类型的地方,做强类型检查

@Target

用来限制注解的使用范围,即指定被修饰的注解能用于哪些程序单元

取值范围定义在ElementType 枚举中

public enum ElementType {TYPE, // 类、接口、枚举类FIELD, // 成员变量(包括:枚举常量)METHOD, // 成员方法PARAMETER, // 方法参数CONSTRUCTOR, // 构造方法LOCAL_VARIABLE, // 局部变量ANNOTATION_TYPE, // 注解类PACKAGE, // 可用于修饰:包TYPE_PARAMETER, // 类型参数,JDK 1.8 新增TYPE_USE // 使用类型的任何地方,JDK 1.8 新增}

@Retention & @RetentionTarget

用于指定被修饰的注解可以保留多长时间,即指定JVM策略在哪个时间点上删除当前注解。保留策略值有以下三个:

定义在RetentionPolicy枚举中。

public enum RetentionPolicy {SOURCE,    // 源文件保留CLASS,       // 编译期保留,默认值RUNTIME   // 运行期保留,可通过反射去获取注解信息
}

@Document

用于指定被修饰的注解可以被javadoc工具提取成文档。定义注解类时使用@Document注解进行修饰,则所有使用该注解修饰的程序元素的API文档中将会包含该注解说明。

@Inherited

指定注解具有继承性,如果某个注解使用@Inherited进行修饰,则该类使用该注解时,其子类将自动被修饰

@Repeatable

用于开发重复注解。在Java8之前,同一个程序元素前只能使用一个相同类型的注解,如果需要在同一个元素前使用多个相同类型的注解必须通过注解容器来实现。

public @interface Authority {String role();
}public @interface Authorities {Authority[] value();
}public class RepeatAnnotationUseOldVersion {@Authorities({@Authority(role="Admin"),@Authority(role="Manager")})public void doSomeThing(){}
}

从Java8开始,允许使用多个相同的类型注解来修饰同一个元素,前提是该类型的注解是可重复的,即在定义注解时要用 @Repeatable元注解进行修饰。

@Repeatable(Authorities.class)
public @interface Authority {String role();
}public @interface Authorities {Authority[] value();
}public class RepeatAnnotationUseNewVersion {@Authority(role="Admin")@Authority(role="Manager")public void doSomeThing(){ }
}

不同的地方是,创建重复注解Authority时,加上@Repeatable,指向存储注解Authorities,在使用时候,直接可以重复使用Authority注解。从上面例子看出,java 8里面做法更适合常规的思维,可读性强一点

@Native

@Native 注解修饰成员变量,则表示这个变量可以被本地代码引用,常常被代码生成工具使用。对于 @Native 注解不常使用,了解即可

类型注解

类型注解被用来支持在Java的程序中做强类型检查。配合插件式的check framework,可以在编译的时候检测出runtime error,以提高代码质量。这就是类型注解的作用了。

关于作者

来自一线程序员Seven的探索与实践,持续学习迭代中~

本文已收录于我的个人博客:https://www.seven97.top

公众号:seven97,欢迎关注~

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.ryyt.cn/news/53605.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈,一经查实,立即删除!

相关文章

【Azure Developer】如何在Azure门户上把当前账号下的所有资源信息列举并导出呢?

问题描述 是否可以在Azure上,一次性把当前账号所有能查看的资源都导出来呢?包含资源名称,类型,定价层SKU信息呢?问题解答 是的,通过Azure Resource Graph Explorer服务可以实现。Azure Resource Graph Explorer 是一个强大的工具,旨在提供跨订阅的资源查询和治理。它允许…

[COCI2013] hiperprostor 题解

前言 题目链接:Hydro & bzoj;黑暗爆炸。 题意简述 \(n\) 个点 \(m\) 条边的有向图上,第 \(i\) 条边的边权被表示为 \(k_i x + b_i\),其中 \(x\) 为一正整数。有 \(q\) 次询问,求出当 \(x\) 取值不同时,\(S\) 到 \(T\) 最短路的值有多少种,以及和为多少。如果最短路的…

c10-8.24课程作业

4、以下哪个口令不是弱口令? D

生产者消费者模式,以及基于BlockingQueue的快速实现

生产者消费者模式,以及基于BlockingQueue的快速实现什么是生产者消费者模式,简单来说就是有两个角色,一个角色主要负责生产数据,一个角色主要负责消费(使用)数据。那么生产者直接依赖消费者,然后直接调用是否可以?答案是可以的,但是有些场景无法及时解决,典型的就是生…

ETL语句

ETL(Extract, Transform, Load)是数据处理工作的重要组成部分,即提取、转换、加载(从一个地方提取数据,通过转换,加载到另一个地方)。通常可以使用SQL语句实现

一张报表完成工厂生产综合数据分析,用这款免费报表工具就够了

在当今快节奏的工业环境中,工厂管理者们越来越依赖于数据分析来优化生产流程、提高效率和降低成本。然而,传统的数据分析工具往往复杂难用,且动辄需要高昂的费用,这让很多工厂望而却步。不过最近本人发现了一款非常实用的报表工具,叫作山海鲸可视化(官网:shanhaibi.com/…

RE入门第四天---做新手题

题目来自polarDN wp来自: PolarCTF靶场Reverse方向简单难度Writeup - 这里是千夏 (l0serqianxia.github.io) polar靶场reverse区简单难度题目详解 - 先知社区 (aliyun.com) shell 考查:UPX自动脱壳 下载下来 ida打开有壳的体现 尝试自动脱壳 D:\..CTFgoju\reverse\UPX\upx-4.…

笔记——字符串

蓝月の笔记——字符串篇 摘要 一些串串 \(\quad\qquad\)——某yl新高一学长 字串 \(\quad\qquad\)——某yl新高一学长のppt Warning 本文中字符串的下标有时从 \(1\) 开始有时从 \(0\) 开始,请自行分辨无特殊说明从 \(1\) 开始 字符串长度无特殊说明为 \(n\) 字符串无特殊说明…