JavaSE进阶--注解

news2025/1/10 20:57:26

文章目录

  • 前言
  • 一、概念
  • 二、使用实例
    • 1、Junit测试中
    • 2、JDK内置注解
  • 三、自定义注解
    • 1、注解声明
    • 2、注解配置参数
      • 2.1 配置参数的类型:
      • 2.2 注意
      • 2.3 两个概念
    • 3、使用注解
  • 四、元注解
    • 1、@Retention
      • 1.1 RetentionPolicy.SOURCE
      • 1.2 RetentionPolicy.CLASS
      • 1.3 RetentionPolicy.RUNTIME
      • 1.4 总结
    • 2、@Target
    • 3、@Documented
    • 4、@Inherited
      • 4.1 自定义注解、接口、实现类
      • 4.2 测试

前言

📢 大家好,我是程序员Forlan,本篇内容主要分享注解,属于基础内容,通过概念入手,了解使用的场景,自定义注解,理解清楚注解的具体用法~

一、概念

注解(Annotation),也叫元数据,是JDK5.0 新增的

注解其实就是代码里的特殊标记,这些标记可以在编译、类加载、运行时被读取,并执行相应的处理。
通过使用注解,程序员可以在不改变原有逻辑的情况下,在源文件中嵌入一些补充信息。使用注解时要在其前面增加@符号,并把该注解当成一个修饰符使用。用于修饰它支持的程序元素。

重要性?
Annotation 可以像修饰符一样被使用,可用于修饰包,类,构造器,方法,成员变量,参数,局部变量的声明,这些信息被保存在Annotation的"name=value"对中。在JavaSE中,注解的使用目的比较简单,例如标记过时的功能,忽略警告等。在JavaEE/ArIdroid中注解占据了更重要的角色,例如用来配置应用程序的任何切面,代替JavaEE旧版中所遗留的繁冗代码和XML配置等。未来的开发模式都是基于注解的,JPA(java的持久化API)是基于注解的,Spring2.5以前都是基于注解的,Hibernate3.x以后也是基于注解的,现在的Struts2有一部分也是基于注解的了,注解是一种趋势,一定程度上可以说 :框架=注解+反射+设计模式。

二、使用实例

1、Junit测试中

public class AnnotationTest {
	@Before
	public void start() {
		System.out.println("方法开始了。。。");
	}

	@After
	public void end() {
		System.out.println("方法结束了。。。");
	}

	@Test
	public void testForlan() {
		System.out.println("执行方法");
	}
}

2、JDK内置注解

@Override:限定于重写父类方法,该注解只能用于方法,重写错误,就会有提示
@Deprecated:用于表示所修饰的元素(类,方法,构造器,属性等)已过时,通常是因为所修饰的结构危险或存在更好的选择
@SuppressWarnings:抑制编译器警告

三、自定义注解

public @interface Forlan {
	public String name();
	int age default 18;
}

1、注解声明

在这里插入图片描述
声明使用的是关键字@interface,这个就是注解,在底层实现上,所有定义的注解都会自动继承java.lang.annotation.Annotation接口

2、注解配置参数

2.1 配置参数的类型:

  • 基本数据类型
  • String
  • Class
  • 枚举
  • 注解
  • 数组

2.2 注意

  • 如果只有一个参数的话,名字尽量叫value,因为可以省略不写
  • 如果设置了默认值,那么无需赋值,default代表默认值
  • 如果没有默认值,后续使用是必须赋值的
  • 访问修饰符必须为public,不写默认是public
  • ()只是一个特殊语法,不能在其中定义任何东西
  • 注解的内部是可以不定义属性的

2.3 两个概念

标记:内部没有配置参数的注解
元数据:内部有配置参数的注解

3、使用注解

直接写@注解名,比如@Forlan

四、元注解

元注解是用于修饰其它注解的注解
JDK5.0提供了四种元注解:Retention, Target, Documented, Inherited

1、@Retention

用于修饰注解,指定注解的生命周期,使用@Rentention时必须为该value成员变量指定值

public enum RetentionPolicy {
    /**
     * Annotations are to be discarded by the compiler.
     */
    SOURCE,

    /**
     * Annotations are to be recorded in the class file by the compiler
     * but need not be retained by the VM at run time.  This is the default
     * behavior.
     */
    CLASS,

    /**
     * Annotations are to be recorded in the class file by the compiler and
     * retained by the VM at run time, so they may be read reflectively.
     *
     * @see java.lang.reflect.AnnotatedElement
     */
    RUNTIME
}

1.1 RetentionPolicy.SOURCE

在源文件中有效,编译器会直接丢弃这种策略的注释,即在.class文件中不会保留注解信息

下面我们通过反编译查看字节码文件,发现字节码文件中没有@Forlan这个注解,也就是使用这个注解的地方看不到,不起作用

在这里插入图片描述
在这里插入图片描述

1.2 RetentionPolicy.CLASS

默认状态,在class文件中有效,保留在.class文件中,但是当运行Java程序时,他就不会继续加载了,不会保留在内存中,JVM不会保留注解

反编译查看字节码文件,字节码文件中带有@Forlan
在这里插入图片描述

1.3 RetentionPolicy.RUNTIME

在运行时有效,当运行 Java程序时,JVM会保留注释,加载到内存中了,那么程序可以通过反射获取该注释

1.4 总结

一般使用RUNTIME,SOURCE和CLASS一般不使用,默认是CLASS

2、@Target

用于修饰注解的注解,指定作用目标,使用@Target时必须为该value成员变量指定值
包含很多种类型,如下:

public enum ElementType {
    /** Class, interface (including annotation type), or enum declaration */
    TYPE,

    /** Field declaration (includes enum constants) */
    FIELD,

    /** Method declaration */
    METHOD,

    /** Formal parameter declaration */
    PARAMETER,

    /** Constructor declaration */
    CONSTRUCTOR,

    /** Local variable declaration */
    LOCAL_VARIABLE,

    /** Annotation type declaration */
    ANNOTATION_TYPE,

    /** Package declaration */
    PACKAGE,

	/** Type parameter declaration */
    TYPE_PARAMETER,

	/** Use of a type */
    TYPE_USE
}

3、@Documented

一般很少使用
被该元注解修饰的注解,将被javadoc工具提取成文档。默认情况下,Javadoc是 不包括注解的,但是加上了这个注解生成的文档中就会带着注解了

4、@Inherited

一般极少使用
被它修饰的Annotation将具有继承性。如果某个类使用了被@Inherited修饰了,则其子类将自动具有该注解
只是继承,实现接口是没有的

4.1 自定义注解、接口、实现类

@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.TYPE)
@Inherited
public @interface Forlan {

}

@Forlan
public class Food {
	...
}

@MyAnnotation
public class Rice extends Food {
	...
}

4.2 测试

可以看到,打印出来两个注解,@Forlan就是继承父类的

Class cls = Class.forName("cn.forlan.reflection.entity.Dog");
Annotation[] annotations = cls.getAnnotations();
for (Annotation annotation : annotations) {
	System.out.println(annotation);
}

@cn.forlan.annotation.Forlan()
@cn.forlan.reflection.MyAnnotation()

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

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

相关文章

千万不要在简历里写精通C++,没人能真正精通C++

任何说自己很懂C的人可能都是在夸大其词。 我想你可能已经注意到了,是的,今天的大多数程序员都在使用Python、Rust、Go或是其他新的编程语言。大部分人已经不再需要掌握C、C等古老的编程语言了,甚至很多程序员已经从手动编码开始向AI编码转型…

el-select 触底分页+远程搜索

文章目录 前言一、el-select 触底分页远程搜索1.封装触底自定义指令2.在 mian.js 引入封装好的自定义指令3.在组件中进行使用 总结 前言 大部分情况下使用 el-select 的时候,el-options 中 options 的值都是后端接口给的数据,直接赋值就可以了。但是有的…

(8版本)mysql数据库安装教程(自用保存)

博主简介:想进大厂的打工人博主主页:xyk:所属专栏: mysql 参考csdn大神们的文章, 总结出来的详细用法~~~ 目录 文章目录 一、下载MySQL8.0.33 二、配置初始化文件my.ini(重点) 三、初始化MySQL 四、安装MySQL服务并启动 修改密码 4.1 安装…

akima 插值拟合算法 Python/C++版本

目录 前言Akima简介Akima优势 算法的代码实现python版C 版代码解析1代码解析2代码解析3 结果测试 前言 鉴于CSDN上Akima算法文章大部分要VIP观看或者下载,即使是付费也有质量不佳,浪费Money也浪费时间。 笔者更具查到的资料分享给大家。 Akima简介 Ak…

C++技能系列 ( 5 ) - 详解函数入参/返回参使用(值传递/引用传递/指针传递/智能指针传递)

系列文章目录 C技能系列 Linux通信架构系列 C高性能优化编程系列 深入理解软件架构设计系列 高级C并发线程编程 期待动动小手,点击关注哦!!! 当你休息的时候,一定要想到别人还在奔跑。 When you rest, we must thin…

数据库相关

1、主要考点思维导图 2、如何设计一个关系型数据库 存储管理:数据逻辑关系转为物理存储关系。 缓存机制:优化执行效率。 SQL解析:将Sql语句进行解析。 日志管理:记录操作。 权限划分:多用户管理。 容灾机制&…

2、瑞丽-伯纳德对流的拉格朗日拟序结构(FTLE场结果对比)

在上篇博客中,我简单比较了瑞丽伯纳德对流的FTLE场,但是因为粒子追踪采用的是欧拉方法,所以精度不是很高, 因此与文献中的结果还是有些差别。 下面放一张文献中的FTLE场,参数与上篇文章是一致的,Ra 1e8;Pr…

《面试1v1》SpringBean生命周期

🍅 作者简介:王哥,CSDN2022博客总榜Top100🏆、博客专家💪 🍅 技术交流:定期更新Java硬核干货,不定期送书活动 🍅 王哥多年工作总结:Java学习路线总结&#xf…

python:使用Scikit-image对遥感影像进行边缘检测(edges)

作者:CSDN @ _养乐多_ 本文将介绍使用Scikit-image库中用于边缘检测特征提取的一些方法及其代码。方法包括 Canny边缘检测(canny),Sobel边缘检测(sobel),Scharr边缘检测(scharr), Roberts边缘检测(roberts),Prewitt边缘检测(prewitt),Farid边缘检测(farid),…

HJ48 从单向链表中删除指定值的节点

描述 输入一个单向链表和一个节点的值,从单向链表中删除等于该值的节点,删除后如果链表中无节点则返回空指针。 链表的值不能重复。 构造过程,例如输入一行数据为: 6 2 1 2 3 2 5 1 4 5 7 2 2 则第一个参数6表示输入总共6个节点&am…

Day24 实战篇 ——Jmeter通过JDBC测试实战

Day24 实战篇 ——Jmeter通过JDBC测试实战 文章目录 Day24 实战篇 ——Jmeter通过JDBC测试实战1、**业务级脚本开发**2、**接口级脚本开发**3、**JDBC脚本开发**4、**JMS Point-to-Poibt脚本开发**5、**Jmeter轻量级接口自动化测试框架**(了解就行)1、业务级脚本开发 登录脚…

《2023 年 React 生态》

大家好,我是 Chocolate。 前不久看到一篇不错的内容,来自于 The React Ecosystem in 2023,也结合自己今年使用的 React 生态总结一下。 本文并非视频演讲稿,和视频内容还是有一点点区别,视频内容相对来说会更加详细一…

ffmpeg(一) ffmpeg+QT开发环境搭建

1、开发库的选择 (1)音视频开发库 每个主流平台基本都有自己的音视频开发库(API),用以处理音视频数据,比如: iOS:AVFoundation、AudioUnit 等 Android:MediaPlayer、Me…

Flink 学习九 Flink 程序分布式运行部署

Flink 学习九 Flink 程序分布式运行部署 1.Job 执行计划 层级说明备注StreamGraph用户代码生成的最初的图程序的运行流程图JobGraph将多个符合条件的节点多个符合条件的节点合并,减少序列化和反序列化ExecutionGraphJobGraph 的并行化调度层的核心数据结构PhysicalGraphJobMa…

【计算机组成原理】信息编码与数据表示

目录 一、进位计数制 二、信息编码 三、定点数的表示 四、校验码 五、浮点数的表示 一、进位计数制 整数部分: 二进制、八进制、十六进制 ---> 十进制:加权求和二进制 ---> 八进制:每三位分为一组,转为八进制…

CloFormer实战:使用CloFormer实现图像分类任务(一)

文章目录 摘要安装包安装efficientnet_pytorch安装timm安装 grad-cam 数据增强Cutout和MixupEMA项目结构计算mean和std生成数据集 摘要 论文翻译:https://blog.csdn.net/m0_47867638/article/details/131161083 官方源码:https://github.com/qhfan/CloF…

faceswap安装教程图文详解

Faceswap是一种人脸识别技术,可以将一个人的面部特征与另一个人的面部特征进行交换,从而创建出一个看起来像是两个人融合在一起的图像或视频。这项技术可以用于各种目的,包括艺术创作、电影制作、虚拟现实、安全监控等领域。Faceswap的实现方…

UE特效案例 —— 寒冰武器

一,环境配置 创建默认地形Landscape,如给地形上材质需确定比例;添加环境主光源DirectionalLight,设置相应的强度和颜色;PostProcessVolume设置曝光,设置Min/Max Brightness为1; 与关闭Game Sett…

怎样开始用selenium进行自动化测试?

如果您刚开始使用 Selenium 进行自动化测试,以下是建议的步骤。 1、安装 Selenium 首先,您需要安装 Selenium。Selenium 支持多种编程语言,如 Python、Java、C# 等。可以通过 pip 命令在 Python 中安装 Selenium: pip install …

CloFormer实战:使用CloFormer实现图像分类任务(二)

文章目录 训练部分导入项目使用的库设置随机因子设置全局参数图像预处理与增强读取数据设置Loss设置模型设置优化器和学习率调整算法设置混合精度,DP多卡,EMA定义训练和验证函数训练函数验证函数调用训练和验证方法 运行以及结果查看测试热力图可视化展示…