【Java】注解

java内置注解 java的内置注解相关视频,想了解的朋友可以看看,谢谢! 立即下载

Java熟悉又陌生的特性:注解

0. 前言

遥想当年,当我第一次接触Java的注解时,心中不免泛起波澜:Java 代码还能这么写,很多功能,通过一个注解九年实现了!作为一名刚毕业不久的小白,在学校考完C仿佛还是昨日的事,印象中,C好像尚未提供注解。Java项目渐渐写了一些之后,时常还是会感叹:用注解真爽!

我们有时在阅读框架源码的时候,不难发现,源码也用了大量注解,可见注解的强大以及使用的广泛。

让我们开始学习!

学习目标

  • 了解常用基本内置注解
  • 尝试自定义注解
  • 通过拓展资料,了解注解的原理

参考教程
优快云-注解原理优秀参考博文:https://blog.youkuaiyun.com/nanhuaibeian/article/details/121290597

1. 基本内置注解

这里列举一些常见的基本内置注解。

1.1 @Override

@Override 表示重写 ,是我们最常见,最常用的注解之一。作用于方法上,表示方法的重写。

@Override源码

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

源码解析

  • @Target 表示 该注解作用于哪块区域,从此处得知,@Override作用于方法上
  • @Retention用于指定注解的保留策略,从此处得知,只在源代码中存在,编译后就会丢失,因此不会产生额外开销

作用
@Override 作用于方法上,用于帮助开发者在编译时捕获一些潜在的错误。如果你错误地将一个方法标记为重写,但实际上并没有重写父类中的方法,编译器会发出警告或错误信息,提醒你检查代码逻辑。

举个例子:

public class HelloAnnotation {
    @Override
    public String toString() {
        return "Hello Annotation";
    }
    
    /**
     * 重写hashCode方法,但由于单词拼错了,加上@Override注解后,
     * 编译器会出现提醒我们方法写错了,下面代码会报错
     */
    @Override
    public int toHashCode() {
        return 1;
    }
}

1.2 @Deprecated

表示这个方法已过期。这个注解已经很少用了,大家了解一下即可。

@Deprecated源码

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

源码解析

  • @Documented 注解用于指示这个自定义注解应该在生成的JavaDoc中进行文档化。
  • @Retention(RetentionPolicy.RUNTIME) 注解指定了这个自定义注解应该在运行时保留,并且可以通过反射访问。
  • @Target注解指定了该注解可以作用于构造方法、字段、局部变量、方法、包、参数和类型上。

1.3 @SuppressWarnings

源码

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

源码解析
源码上的注解意思和上文的解释一致;
但是这个SupperessWarnings内置了一个方法,这个方法返回一个String类型的数组。这个方法用于表示注解的参数

作用
用于手动忽略一些告警,具体哪些告警,由该注解的参数决定。常见的参数如下:

  1. deprecation:使用了不赞成使用的类或方法时的警告(使用@Deprecated使得编译器产生的警告);
  2. unchecked:执行了未检查的转换时的警告,例如当使用集合时没有用泛型 (Generics) 来指定集合保存的类型; 关闭编译器警告
  3. fallthrough:当 Switch 程序块直接通往下一种情况而没有 Break 时的警告;
  4. path:在类路径、源文件路径等中有不存在的路径时的警告;
  5. serial:当在可序列化的类上缺少 serialVersionUID 定义时的警告;
  6. finally:任何 finally 子句不能正常完成时的警告;
  7. rawtypes 泛型类型未指明
  8. unused 引用定义了,但是没有被使用
  9. all:关于以上所有情况的警告。

举例

@SuppressWarnings(value = {"unchecked", "deprecation"})
public void sayHi() {
    List list = new ArrayList();
}

当然,我们在日常使用中也能得知,有时我们也可以省略参数名,例如上述代码可写成:

@SuppressWarnings({ "unchecked", "deprecation" })
public void sayHi() {
    List list = new ArrayList();
}

1.4 @SafeVarargs

Java 1.7 以后 的一个较新的内置注解,用于可变长参数的泛型静态方法或final修饰的方法去掉告警。这个注解也用得很少,我们了解一下即可:

@SafeVarargs源码

@Documented
@Retention(RetentionPolicy.RUNTIME)
@Target({ElementType.CONSTRUCTOR, ElementType.METHOD})
public @interface SafeVarargs {
}

举例

@SafeVarargs
public static <T> T getFirstOne(T... elements) {
    return elements.length > 0 ? elements[0] : null;
}

1.5 @FunctionalInterface

函数式接口标记注解,用于标记这是一个函数式接口。

@FunctionalInterface源码

@Documented
@Retention(RetentionPolicy.RUNTIME)
@Target({ElementType.TYPE})
public @interface FunctionalInterface {
}

由于接口是一种特殊的数据类型,因此@Target注解的参数为Element.TYPE,表示这个注解作用于接口。

举例

@FunctionalInterface
    public interface Hello {
        void sayHello();
    }

1.6 小结

以上是Java 常见的内置注解。其中,最常用的只有 @Override,其余注解的学习与解读,可以当作为读其他注解作准备。

2. 元注解

元用于注解、自定义注解的注解。是注解的注解。
在上面内置注解的学习中我们已经接触过。

元注解有这么几种:
@Target
@Retention
@Inherited
@Documented
@Repeatable (java1.8 新增)

2.1 @Target

指定注解的作用域。

源码

@Documented
@Retention(RetentionPolicy.RUNTIME)
@Target({ElementType.ANNOTATION_TYPE})
public @interface Target {
    ElementType[] value();
}

属性值

  • ElementType.TYPE:能修饰类、接口或枚举类型
  • ElementType.FIELD:能修饰成员变量
  • ElementType.METHOD:能修饰方法
  • ElementType.PARAMETER:能修饰参数
  • ElementType.CONSTRUCTOR:能修饰构造器
  • ElementType.LOCAL_VARIABLE:能修饰局部变量
  • ElementType.ANNOTATION_TYPE:能修饰注解
  • ElementType.PACKAGE:能修饰包

2.2 @Retention

指定注解的保留策略。

源码

@Documented
@Retention(RetentionPolicy.RUNTIME)
@Target({ElementType.ANNOTATION_TYPE})
public @interface Retention {
    RetentionPolicy value();
}

属性值

  • RetentionPolicy.SOURCE: 注解只在源代码中存在,编译成class之后,就没了。
  • RetentionPolicy.CLASS: 注解在java文件编程成.class文件后,依然存在,但是运行起来后就没了。@Retention的默认值。
  • RetentionPolicy.RUNTIME: 注解在运行起来之后依然存在,程序可以通过反射获取这些信息。

2.3 @Inherited

@Inherited 是一个Java内置注解,用于标记一个注解是否可以被子类继承。当一个注解被@Inherited修饰时,子类会自动继承父类的注解。这个注解在实际应用中可以用于一些框架或库中,以便在继承关系中传递注解的信息。 例如我们的@Transactional注解就用了该元注解

@Target({ElementType.TYPE, ElementType.METHOD})
@Retention(RetentionPolicy.RUNTIME)
@Inherited
@Documented
public @interface Transactional {
    ......
}

2.4 @Documented

@Documented 注解添加后,我们就可以导出生成 java doc 文档了。日常开发中我们实际用得最少,篇幅有限,暂时不作细致讲解。

2.5 @Repeatable

由于默认情况下,同一个注解在同一个作用域只能出现一次。@Repeatable注解表示,由该注解修饰的注解,是否能在同一个作用域出现多次。

举个例子:

@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.TYPE)
public @interface RepeatableAnnotationContainer {
    RepeatableAnnotation[] value();
}
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.TYPE)
@Repeatable(RepeatableAnnotationContainer.class)
public @interface RepeatableAnnotation {
    String value();
}

3. 自定义注解

学习完上述内置注解、元注解的基本概念与略微分析源码后,我们就可以自定义注解了。

通过观察发现,注解都有@interface这个关键字。

在Java中,用于定义注解的关键字是@interface。这是Java语言中专门用于声明自定义注解的关键字。通过使用@interface关键字,我们可以在代码中定义新的注解类型,并为该注解类型指定各种属性和行为。

例如,我们可以写一个自定义注解,用于标记排序方法:

@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.METHOD)
public @interface SortMethod {
    String value() default "ascending";
}

再例如,在前面提到过的@Repeatable 注解举得例子,就是一个自定义注解。

@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.TYPE)
public @interface RepeatableAnnotationContainer {
    RepeatableAnnotation[] value();
}
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.TYPE)
@Repeatable(RepeatableAnnotationContainer.class)
public @interface RepeatableAnnotation {
    String value();
}

以上注解用起来时:

@RepeatableAnnotation("First Annotation")
@RepeatableAnnotation("Second Annotation")
public class MyClass {
    // Class body
}

4. 总结与补充

4.1 补充

注解是Java中的一种元数据形式,可以添加到类、方法、字段和参数等代码元素上。它们提供了关于代码的额外信息,并可以在编译时或运行时由工具和框架进行处理。
在Java中,注解被定义为扩展了 java.lang.annotation.Annotation 接口的接口。这意味着注解本质上是接口。当你定义一个自定义注解时,实际上是隐式地创建了一个继承了 Annotation 接口的接口。

而实现注解的原理是反射,具体详见本文开头提到的参考教程或者其他参考教程。

4.2 总结

在学习注解的过程中,由于不习惯注解本身的写法,例如@interface关键字的使用,也容易和一般的接口搞混,难以理解,因此我个人在学习注解的过程中,将注解当成一种Java特有的语法来学习,通过这样学习,结合日常频繁的使用,或许就能渐渐熟悉并适应。

Win11实时字幕还能这么玩?手把手教你打造专属‘AI字幕机’,告别视频网站无字幕困扰 本文详细介绍了如何利用Win11的实时字幕功能打造全平台通用的AI字幕系统。通过C#抓取程序、Node.js中转服务和前端展示界面的组合,实现自动抓取系统字幕并实时推送到任意网页视频的方案,有效解决在线视频无字幕的困扰。 阅读详情

相关推荐

从OAuth到DID:Web4.0身份验证协议的技术演进图谱

在数字身份体系从Web2.0向Web4.0跨越的进程中,身份验证协议正经历着从中心化授权到自主主权的范式转移。本文通过对比OAuth 2.0、OpenID Connect等传统方案与W3C DID、ION等去中心化协议的技术架构,揭示身份验证技术在性能、安全、隐私三大维度的代际差异。基于对GitHub、欧盟数字身份钱包等典型系统的实测数据分析,量化评估中心化授权服务器的单点故障风险与DID链上验证的吞吐量瓶颈。结合零知识证明、分布式密钥管理等前沿技术,为开发者提供面向Web4.0的渐进式身份架构迁移策略。

水务人 835

什么是元注解 元注解有哪些 元注解是干什么的 注解用什么修饰

@Retention @Document @Target @Inherited @Repeatable 类型注解(Type Annotation) 怎么用 ,元注解怎么用

weixin_57604284的博客 7971

(学习笔记)机器人自主导航从零开始第四步———Rviz、Gazebo、Meshlab的安装

一、Rviz的安装 Rviz是一个

qq_59475883的博客 5057

Java 内置注解

Java内置注解 也称 Java标准注解,是Java JDK 中自带的注解。Java 中有许多标准注解,以下是一些常见的标准注解: 1. @Override:用于表示一个方法是重写父类中的方法。 2. @Deprecated:用于标记已经过时的方法或类,提醒开发者不再使用。 3. @SuppressWarnings:用于抑制编译器产生的警告信息。 4. @FunctionalInterface:用于标记一个接口是函数式接口,即只包含一个抽象方法的接口。

棒棒糖的糖不含糖的博客 645

gem5 prefetcher

最近在gem5上做预取实验,添加自己的预取算法,这里采用hardware stream prefetcher , 修改了几个bug才给实验调试通过,发文记录下实验过程。 gem5上添加自己的预取算法步骤: (1)路径gem5-master/configs/common/Caches.py下,开启预取:class L1Cache(Cache): assoc = 2 tag_late

编程邦 3846

Mac上安装虚拟机搭载window系统

用Mac的都知道,很多window用的软件是Mac版本没有的。平时有的还得要求去用那些软件,有几种方式可供大家选择: 1.再买个window本; 2.装双系统; 3.装虚拟机,搭载window系统。 我比较推荐第3条,这样可以在Mac本上做到双开,一边开着mac一边开着window,还能做到同时处理文件,不至于重新启动操作系统,下边是具体实现步骤,其中有几个需要下载的,建议在网速好的时候完...

Coder_Mumu的博客 1万+

java内置常用注解

@Deprecated:用于注解属性、方法、类。* @Deprecated:用于注解属性、方法、类。* 一、注解:jdk1.5后出的特性,是一个元数据,是一个代码级别的说明。* 一、注解:jdk1.5后出的特性,是一个元数据,是一个代码级别的说明。* @Override:用于注解方法,说明该方法必须是一个重写方法。* @Override:用于注解方法,说明该方法必须是一个重写方法。* 注解在java中都是以“@注解名”的形式呈现。* @Inherited:用于说明注解用于继承性。...

m0_54397364的博客 524

关于Win11安装Ubuntu子系统报错:WslRegisterDistribution failed with error 解决办法

Win11安装Ubuntu子系统报错:WslRegisterDistribution failed with error

qq_51908382的博客 3万+

Java注解总结

Bean注解主要用于方法上,有点类似于工厂方法,当使用了@Bean注解,我们可以连续使用多种定义bean时用到的注解,譬如用@Qualifier注解定义工厂方法的名称,用@Scope注解定义该bean的作用域范围,譬如是singleton还是prototype等。这个是Spring5.0里面新加入的一个注解,它是一个加速注解,也就是说默认Spring容器一启动的时候,所有的组件才会进行加载创建对象,如果有大量的组件经常要用到,又不想等Spring容器启动的时候才加载并创建对象,那么就可以标注。

weixin_51001722的博客 5127

【文献阅读】使用深度语音后验改进独立于说话者的构音障碍可懂度分类

原文名称:本文探讨了利用DeepSpeech后验概率改进说话人无关的构音障碍可理解性分类方法。作者提出了一个基于DeepSpeech(一种端到端的语音转文本引擎)输出的新特征集,用于评估构音障碍患者的语音可理解性。这些新特征在说话人无关的情况下表现良好,能够更好地处理不同说话人的变异性。背景介绍:数据集:特征提取:实验设置:结果:本文提出的新特征集在说话人无关的构音障碍可理解性分类任务中表现出色,特别是在低可理解性和高可理解性类别上。未来的工作将集中在减少低可理解性和中可理解性类别之间的混淆,以进一步提高系

帅小柏的博客 452

C++ 小游戏程序 (共七款)

C++编程小游戏_闪耀的天狼星的博客-优快云博客_游戏c++C++跑酷小游戏_闪耀的天狼星的博客-优快云博客。好玩的c++编程小游戏,共六款。代码】C++跑酷小游戏。

小天狼星_布莱克 的博客 3万+

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

前言 Java 注解(Annotation)又称 Java 标注,是 JDK5.0 引入的一种注释机制。重点:和 Javadoc 不同,Java 标注可以通过反射获取标注内容。 大话空话不用说太多,简而言之,在编译器生成类文件时,标注 可以被嵌入到字节码中。Java 虚拟机可以保留标注内容,在运行时可以获取到标注内容 。当然它也支持自定义 Java 标注。反射+注解,是不是感觉Java变成一种动态语言?哈哈哈! 我觉得注解可以分为三个部分来讲:内置注解,元注解,自定义注解。 一、内置注解 1、@O

qq3164069700的博客 1436

优秀的 Verilog/FPGA开源项目介绍(二十七)- 小型CPU

介绍在FPGA上实现一个CPU是一个令人兴奋的事情,但是太复杂的CPU实现起来太难,而且不适合去了解计算机的架构,所以今天介绍一些小型的CPU,比如8051、MIPS、MSP430等~关于RISC-V的项目,请查看《优秀的 Verilog/FPGA开源项目介绍(二)-RISC-V》ZipCPUhttp://zipcpu.com/about/zipcpu.html项目介绍Z...

OpenFPGA的博客 2576

Java注解

为什么要引入注解? 使用【注解】之前(甚至在使用之后),【XML】被广泛的应用于描述元数据,得到各大框架的青睐,它以松耦合的方式完成了框架中几乎所有的配置,但是随着项目越来越庞大,【XML】的内容也越来越复杂,一些应用开发人员和架构师发现维护成本变高。他们希望使用一些和代码紧耦合的东西,于是就有人提出来一种标记式高耦合的配置方式【注解】。方法上可以进行注解,类上也可以注解,字段属性上也可以注解,...

ThinkWon的博客 2万+

怀旧版电脑GBC模拟器

再现原版GBC掌机的界面,电脑运行连游戏界面都一样大小,很怀旧,很真实,(英文版)强烈推荐,很小的文件,很难才找到的。

ET2012新版免狗免安装绿色软件

ET2012新版免狗免安祖昂绿色软件。,新界面,新视觉,

JAVA注解

本文将向你介绍J2SE5.0中的新特性之一:注解。本文将从什么是注解;J2SE5.0中预定义的注解;如何自定义注解;如何对注解进行注解以及如何在程序中读取注解5个方面进行讨论。     一、什么是注解     说起注解,得先提一提什么是元数据(metadata)。所谓元数据就是数据的数据。也就是说,元数据是描述数据的。就象数据表中的字段一样,每个字段描述了这个字段下的数据的含义。而J2SE

rj042的专栏 1万+

老版QQ原生表情gif动态

这是老版的QQ表情,不过全是动态的的,Windows照片查看器是不会动的,可以右击用浏览器打开查看,再说一遍是老版的,只是分享给宁愿用老版也要动态的人。

java注解怎么写_java注解

写在前面现在的java主流框架中,注解无处不在,因此我们完全有必要搞明白注解到底是什么。如何理解注解,它到底是怎么起作用的。注解的定义java是这样定义注解的:Java 注解用于为 Java 代码提供元数据。作为元数据,注解不直接影响你的代码执行,但也有一些类型的注解实际上可以用于这一目的。什么又是元数据的呢?说白了就是描述数据的数据,既然注解被称为元数据,具有描述作用,那么我们是不是可以把注解理...

weixin_42476912的博客 2245

华为的C语言编程规范.pdf

华为技术有限公司内部技术规范。本规范制定了编写C语言程序的基本原则、规则和建议。从代码的清晰、简洁、可测试、安全、程序效率、可移植各个方面对C语言编程作出了具体指导。

java 注解 entity_Java 注解

一. 简介注解是java5的新特性。注解可以看做一种注释或者元数据(MetaData),可以把它插入到我们的java代码中,用来描述我们的java类,从而影响java类的行为。二. 基本语法1. 注解的使用形式:一个java注解由一个@符后面跟一个字符串构成,类似于这样:@Entityjava注解中一般包含一些元素,这些元素类似于属性或者参数,可以用来设置值,比如我们有一个包含两个元素的@Enti...

weixin_42384743的博客 2349

Java注解与元注解

使用@interface关键字来定义注解,注解中的方法称为注解元素,注解元素可以有默认值。// 定义一个简单的注解元注解是用于注解其他注解的注解,它们可以控制注解的使用范围、生命周期等。Java 提供了几个元注解,常用的有@Retention@Target和@Inherited。

dsq_MaDing的博客 683

java注解的使用及常用注解

java注解的使用及常用注解

qq_42003527的博客 2342

java 注解 id_java注解

java注解:Java 注解用于为 Java 代码提供元数据。作为元数据,注解不直接影响你的代码执行,但也有一些类型的注解实际上可以用于这一目的。Java 注解是从 Java5 开始添加到 Java 的。注解理解的前提:我认为注解就是标签它是在 Java SE 5.0 版本中开始引入的概念,就如同java中的 class和interface说到这个就不得不说注解中的基础元注解元注解: 元注解是可以...

weixin_42547335的博客 1297

Java注解以及自定义注解

Java注解以及自定义注解

YIYIYI 1968

java 注解 数组_Java注解,就是那么简单

深入理解注解1、基本介绍2 内置注解2.1@Deprecated注解2.2@Override注解2.3@SuppressWarnings注解3、元注解简介3.1@Target3.2@Rentention3.3@Documented3.4@Inherited4、自定义注解5、获取注解中的参数值5.1参数值是基本类型5.2参数值是对象1、基本介绍基本概念:注解,顾名思义,就是对某一事物进行添...

weixin_34017915的博客 4110
上一篇: 【杂谈】浅浅地学学C语言指针
下一篇: 【Druid】慢SQL监控、邮件通知及日志拆分
CoderSharry
博客等级 码龄4年 515粉丝 69原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值