JAVA自定义注释

@interface 声明

package test;
public @interface InProgress { }
@InProgress
public void calculateInterest(float amount, float rate) {
}

带成员

public @interface TODO {String value();
}
@InProgress
//只有成员变量名有value时,值有给value赋值时可以这么写
@TODO("Figure out the amount of interest per month")
//@TODO(value="Figure out the amount of interest per month")
public void calculateInterest(float amount, float rate) {
}

成员带默认值

public @interface GroupTODO {public enum Severity { CRITICAL, IMPORTANT, TRIVIAL, DOCUMENTATION };Severity severity() default Severity.IMPORTANT;String item();String assignedTo();String dateAssigned();
}
@InProgress
@GroupTODO(item="Figure out the amount of interest per month",assignedTo="BrettMcLaughlin",dateAssigned="08/04/2004")
public void calculateInterest(float amount, float rate) {
// Need to finish this method later
}

改写默认值

@InProgress
@GroupTODO(severity=GroupTODO.Severity.DOCUMENTATION,item="Need to explain how this rather unusual method works",assignedTo="Jon Stevens",dateAssigned="07/30/2004")
public void reallyConfusingMethod(int codePoint) {
// Really weird code implementation
}

对注释的注释

结束关于注释的讨论之前(至少在本系列文章中),我想简要地讨论一下注释的注释。第 1 部分中所接触的预定义注释类型都有预定义的目的。但是在编写自己的注释类型时,注释类型的目的并不总是显而易见的。除了基本的文档外,可能还要针对某个特 定的成员类型或者一组成员类型编写类型。这就要求您为注释类型提供某种元数据,以便编译器保证按照预期的目的使用注释。

当然,首先想到的就是 Java 语言选择的元数据形式 —— 注释。您可以使用 4 种预定义的注释类型(称为 元注释 )对您的注释进行注释。我将对这 4 种类型分别进行介绍。

@Target 声明

指定自定义注释的应用范围,规定的范围类型如下

package java.lang.annotation;
public enum ElementType {TYPE, // Class, interface, or enum (but not annotation)FIELD, // Field (including enumerated values)METHOD, // Method (does not include constructors)PARAMETER, // Method parameterCONSTRUCTOR, // ConstructorLOCAL_VARIABLE, // Local variable or catch clauseANNOTATION_TYPE, // Annotation Types (meta-annotations)PACKAGE // Java package
}

以下表示将自定义注释@TODO可用于类(包括接口和枚举),方法、构造函数和其他注释类型。

import java.lang.annotation.ElementType;
import java.lang.annotation.Target;@Target({ElementType.TYPE,ElementType.METHOD,ElementType.CONSTRUCTOR,ElementType.ANNOTATION_TYPE})
public @interface TODO {String value();
}

@Retention 声明

可用的值范围(一般都使用RUNTIME,在程序运行时,可以通过自定义注释来反射完成一些功能需要)

package java.lang.annotation;
public enum RetentionPolicy {SOURCE, // Annotation is discarded by the compilerCLASS, // Annotation is stored in the class file, but ignored by the VMRUNTIME // Annotation is stored in the class file and read by the VM}

因为 Retention 只有一个成员变量,可以使用默认赋值方式

@Retention(RetentionPolicy.SOURCE)
public @interface SuppressWarnings {
// annotation type body
}

@Documented 声明

这个元注释也非常容易理解,部分原因是 Documented 是一个标记注释。标记注释没有成员变量。 Documented 表示注释应该出现在类的 Javadoc 中。在默认情况下,注释不包括在 Javadoc 中。

import java.lang.annotation.Documented;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;@Documented
@Retention(RetentionPolicy.RUNTIME)
public @interface InProgress { }

使用 Documented 注释类型时@Retention必需取值RUNTIME 。这样,注释就会保留在编译后的类文件中并且由虚拟机加载,然后Javadoc可以从中抽取出来添加到类的HTML文档中。实例说明icon-default.png?t=N7T8https://www.jb51.net/article/263413.htm

@Inherited 声明

生成javadoc时父类中的注释会出现在子类中,默认不出现

import java.lang.annotation.Documented;
import java.lang.annotation.Inherited;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;@Documented
@Inherited
@Retention(RetentionPolicy.RUNTIME)
public @interface InProgress { }

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

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

相关文章

Spring Cloud Eureka

引入:远程调用时,url是写死的 String url "http://127.0.0.1:9090/product/" orderInfo.getProductId(); 解决思路: 比如(医院,学校等)机构的电话号码发生变化,就需要通知各个使⽤…

Android14系统应用统一裁剪方案

Android14系统应用统一裁剪方案 背景 当前移除集成到系统里的应用,一般都是根据应用名,到各个mk文件里逐个在PRODUCT_PACKAGES中删除;这种方法,耗时而且不易管理集成到系统里的应用;需要有一个统一管理删除不需要应用的方案。 方案 参考PRODUCT_PACKAGES变量,添加PRO…

游戏的无边框模式是什么?有啥用?

现在很多游戏的显示设置中,都有个比较特殊的选项“无边框”。小伙伴们如果尝试过,就会发现这个效果和全屏几乎一毛一样,于是就很欢快地用了起来,不过大家也许会发现,怎么和全屏比起来,似乎有点不够爽快&…

uniapp编译成h5后接口请求参数变成[object object]

问题:uniapp编译成h5后接口请求参数变成[object object] 但是运行在开发者工具上没有一点问题 排查: 1:请求参数:看是否是在请求前就已经变成了[object object]了 结果: 一切正常 2:请求头:看…

AST反混淆实战:提升JavaScript代码的可读性与调试便利性

博客标题:AST反混淆:提升JavaScript代码的可读性与调试便利性 引言 JavaScript代码混淆是一种常见的保护源码的方法,但这也给代码的维护和调试带来了不小的挑战。抽象语法树(AST)提供了一种结构化的方式来分析和转换…

平安好车主:“保”你车平安,“养”出好生活~

“小朋友 你是否有很多问号,为什么......”从出生到长大,不论我们身居何处,年岁几何,妈妈似乎总有嘱咐不完的话。小时候,总不能理解妈妈的话,只想摆脱唠叨,期盼快快长大。 如今,我们羽翼渐丰,已能驾驭人生,肩负起家庭的重任,但妈妈的话却依然从未落下。不过,此刻的我们,不仅能…

Gitea 仓库事件触发Jenkins远程构建

文章目录 引言I Gitea 仓库事件触发Jenkins远程构建1.1 Jenkins配置1.2 Gitea 配置引言 应用场景:项目部署 I Gitea 仓库事件触发Jenkins远程构建 Gitea支持用于仓库事件的Webhooks 1.1 Jenkins配置 高版本Jenkins需要关闭跨域限制和开启匿名用户访问 在Jenkins启动前加入…

STM32入门开发操作记录(一)——新建工程

目录 一、课程准备1. 课程资料2. 配件清单3. 根目录 二、环境搭建三、新建工程1. 载入器件支持包2. 添加模块3. ST配置4. 外观设置5. 主函数文件 一、课程准备 1. 课程资料 本记录操作流程参考自b站视频BV1th411z7snSTM32入门教程-2023版 细致讲解 中文字幕,课程资…

柯桥韩语培训韩语学习力职场口语韩语中的职场黑话你知道几个?

生活中比较常用的,与职场生活有关的新造词有상사병, 직장살이, 무두절(無頭節)等。一起来看下他们的意思吧... 상사병 상사병是指因为上司多变不定的指示而火大的意思。 직장살이 직장살이用来比喻职场生活也需要看上司的脸色,就像在婆家看婆婆脸色一样…

gorm只查询某一些字段字段的方法Select, 和只查询某一字段方法 Pluck

gorm中默认是查询所有字段的, 如果我们只需要获取某些字段的值,可以通过使用 Select方法来指定要查询的字段来实现, 也可以通过定义一个需要字段的结构体来实现; 而如果我们只需要查询某一个字段的值就可以使用 Pluck方法来获取(这…

【刷题汇总 -- 删除公共字符、两个链表的第一个公共结点、mari和shiny】

C日常刷题积累 今日刷题汇总 - day0121、删除公共字符1.1、题目1.2、思路1.3、程序实现 -- 蛮力法1.4、程序实现 -- 哈希 2、两个链表的第一个公共结点2.1、题目2.2、思路2.3、程序实现 -- 对齐比对法2.4、程序实现 -- 公共端点路程法 3、mari和shiny3.1、题目3.2、思路3.3、程…

[python]基于yolov10+gradio目标检测演示系统设计

【设计介绍】 YOLOv10结合Gradio实现目标检测系统设计是一个结合了最新目标检测技术和快速部署框架的项目。下面将详细介绍这一系统的设计和实现过程。 一、YOLOv10介绍 YOLOv10是YOLO(You Only Look Once)系列的最新版本,由清华大学的研究…

vienna整流器的矢量分析

Vienna整流器使用六个二极管和六个IGBT(或MOSFET)组成,提供三个电平:正极电平(P)、中性点电平(O)和负极电平(N)。通过对功率管的控制,Vienna整流器…

Telegram Bot、小程序开发(一)基础入门

文章目录 一、Telegram Bot是什么?二、Telegram Bot应用场景三、机器人是如何工作的?架构getUpdates 和 webhookswebhooks要求自签名证书 四、如何创建和使用Telegram Bot?整体步骤和流程Bot 的申请过程将机器人添加到 Telegram 群组 一、Tel…

昇思25天打卡营第25天|基于MoblieNetv2的垃圾分类

一、简介: 本次实验主要介绍垃圾分类代码开发的方法。通过读取本地图像数据作为输入,对图像中的垃圾物体进行检测,并且将检测结果图片保存到文件中。 实验目的: 了解熟悉垃圾分类应用代码的编写(Python语言&#x…

卷积神经网络——LeNet——FashionMNIST

目录 一、文件结构二、model.py三、model_train.py四、model_test.py 一、文件结构 二、model.py import torch from torch import nn from torchsummary import summaryclass LeNet(nn.Module):def __init__(self):super(LeNet,self).__init__()self.c1 nn.Conv2d(in_channe…

Autosar Dcm配置-0x28服务ComControl-基于ETAS软件

文章目录 前言DcmDcmDsdDcmDspBswMBswMModeRequestPortBswMModeConditionBswMLogicalExpressionBswMActionBswMActionListBswMRule总结前言 0x28服务主要用来控制非诊断报文的通讯,一般在刷写预编程过程中,用来禁止APP的通信报文,可以减少总线负载率,提高刷写成功率。本文…

[C++] STL :stackqueue详解 及 模拟实现

标题:[C] STL :stack&&queue详解 水墨不写bug 目录 (一)stack简介 (二)queue简介 (三)容器适配器 (四)stack和queue的模拟实现 /*** …

数据结构(初阶1.复杂度)

文章目录 一、复杂度概念 二、时间复杂度 2.1 大O的渐进表示法 2.2 时间复杂度计算示例 2.2.1. // 计算Func2的时间复杂度? 2.2.2.// 计算Func3的时间复杂度? 2.2.3.// 计算Func4的时间复杂度? 2.2.4.// 计算strchr的时间复杂度? …

构造者模式的实现

引言——构造复杂对象的艺术 软件工程中,构造复杂对象的艺术被巧妙地封装在构造者模式(Builder Pattern)中。这种设计模式不仅提供了一种清晰且灵活的方式来构建复杂对象,还使得代码更具可读性和可维护性。构造者模式的核心思想是…