Java Annotation自定义注解详解

Java的自定义注解——Annotation的使用 Annotation——自定义注解 Java中提供了 Annotation 功能,该功能可用于类,构造方法,成员变量,方法。参数等的声明中。该功能不会影响程序的运行,但是会对编译器警告等辅助工具产生影响。 定义 Annotation 类型 在定义 Annotation 类型时,需要用到用来定义接口的 interface 关键字,但需要在 interface 关键字前面加一个 “ @ ” 符号,即定... 阅读详情

在开发过程中总能用到注解,但是从来没有自己定义过注解。最近赋闲在家,研究整理了一番,力求知其然知其所以然。

本文会尝试描述什么是注解,以及通过一个Demo来说明如何在程序中自定义注解。Demo没有实际意义,仅仅只是为了注解而使用注解。

 

1、什么是注解?

       注解是在jdk 1.5开始提供的功能,目前被广泛使用。以下是引用《Java疯狂讲义》第十四章关于注解的描述:

       “Annotation其实是代码里的特殊标记,这些标记可以在编译、类加载、运行时被读取,并执行响应的处理。通过使用Annotation,程序开发人员可以在不改变原有逻辑的情况下,在源文件嵌入一些补充信息。代码分析工具、开发工具和部署工具可以通过这些补充信息进行验证或者进行部署。”

      

       JUnit单元测试就是基于注解的。我认为使用动态代理和注解,自己完全也可以写一个MyJUnit。

      

2、Demo的实现:

注解文件:

这个文件主要包含了三个部分:

       A.注解文件使用@interface来声明。

       B.在A外层有元注解声明(注解的注解),主要的作用就是对我们自定义注解的执行范围、时期进声明。下面是注解的注解含义说明:

@Documented:指示某一类型的注释将通过 javadoc 和类似的默认工具进行文档化。应使用此类型来注释这些类型的声明:其注释会影响由其客户端注释的元素的使用。如果类型声明是用 Documented 来注释的,则其注释将成为注释元素的公共 API 的一部分。

@Target:指示注释类型所适用的程序元素的种类。如果注释类型声明中不存在 Target 元注释,则声明的类型可以用在任一程序元素上。如果存在这样的元注释,则编译器强制实施指定的使用限制。例如,此元注释指示该声明类型是其自身,即元注释类型。它只能用在注释类型声明上。

@Inherited:指示注释类型被自动继承。如果在注释类型声明中存在 Inherited 元注释,并且用户在某一类声明中查询该注释类型,同时该类声明中没有此类型的注释,则将在该类的超类中自动查询该注释类型。此过程会重复进行,直到找到此类型的注释或到达了该类层次结构的顶层 (Object) 为止。如果没有超类具有该类型的注释,则查询将指示当前类没有这样的注释。注意,如果使用注释类型注释类以外的任何事物,此元注释类型都是无效的。还要注意,此元注释仅促成从超类继承注释;对已实现接口的注释无效。

@Retention:指示注释类型的注释要保留多久。如果注释类型声明中不存在 Retention 注释,则保留策略默认为 RetentionPolicy.CLASS。

C.方法名就是参数名,返回值类型就是参数的类型,通过default来设置方法的默认值。

 

下面是代码:

package com.array7.annotationTest;

import java.lang.annotation.Documented;
import java.lang.annotation.ElementType;
import java.lang.annotation.Inherited;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;

@Documented
@Target(ElementType.METHOD)
@Inherited
@Retention(RetentionPolicy.RUNTIME)
public @interface MethodInfo {
	String author() default "array7";	// 作者
	String date();	// 日期
	double version() default 1.0;	// 版本号
	String comments();	// 注释
}

然后定义个调用注解的类:

package com.array7.annotationTest;

public class AnnotationExample {
	/**
	 * 非静态方法
	 * @param msg
	 */
	@MethodInfo(author = "七郎", comments = "方法测试注释:print10", date = "2013-11-29", version = 1.0)
	public void print10(Object msg) {
		System.out.println(msg);
	}
	
	/**
	 * 静态方法
	 */
	@MethodInfo(author = "七郎", comments = "方法测试注释:print20", date = "2013-11-20", version = 2.0)
	public static void print20() {
		System.out.println("test");
	}
}

最后就是注解解析类(简单起见我将代码写在了main方法里):


package com.array7.annotationTest;

import java.lang.annotation.Annotation;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;

public class AnnotationParsing {
	public static void main(String[] args) {
		try {
			Class<?> clazz = Class.forName("com.array7.annotationTest.AnnotationExample");	// 这里可以封装成动态代理类。
			// Class clazz = AnnotationParsing.class.getClassLoader().loadClass("com.array7.annotationTest.AnnotationExample");	// 这种方式也OK。
			for (Method method : clazz.getMethods()) {
				if (method.isAnnotationPresent(MethodInfo.class)) {
					for (Annotation anno : method.getAnnotations()) {
						System.out.println("Annotation in Method [" + method + "]:" + anno);
						MethodInfo methodInfo = method.getAnnotation(MethodInfo.class);
						if (methodInfo.version() == 1.0) {
							method.invoke(clazz.newInstance(), methodInfo.comments());
						} else if (methodInfo.version() == 2.0) {
							method.invoke(null);
						}
					}
				}
			}
		} catch (SecurityException e) {
			e.printStackTrace();
		} catch (ClassNotFoundException e) {
			e.printStackTrace();
		} catch (IllegalAccessException e) {
			e.printStackTrace();
		} catch (IllegalArgumentException e) {
			e.printStackTrace();
		} catch (InvocationTargetException e) {
			e.printStackTrace();
		} catch (InstantiationException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		
	}
}


程序最后输出:

Annotation in Method [public void com.array7.annotationTest.AnnotationExample.print10(java.lang.Object)]:@com.array7.annotationTest.MethodInfo(author=七郎, version=1.0, comments=方法测试注释, date=2013-11-20)
方法测试注释
Annotation in Method [public static void com.array7.annotationTest.AnnotationExample.print20()]:@com.array7.annotationTest.MethodInfo(author=七郎, version=2.0, comments=方法测试注释, date=2013-11-20)
test

通过上述输出我们也可以发现,注解有限执行的是实例化之后的方法,然后才是静态方法。

 

上面所提到的知识理论和实践,是本人通过书籍、Java文档、互联网资料总结并亲自验证的。

如果哪位道友发现有表达不准确的地方,欢迎指正,免得误人误己,多谢。


相控阵雷达仿真入门:TWS与TAS模式实战解析(附代码示例) 本文深入解析相控阵雷达仿真中的TWS(边搜索边跟踪)与TAS(搜索加跟踪)模式,提供实战代码示例和优化策略。通过简化模型设计和对象化建模,帮助开发者快速构建高效仿真系统,适用于军事推演和装备评估。文章涵盖核心逻辑、数据结构设计及性能优化技巧,提升仿真效率与准确性。 阅读详情

相关推荐

实战指南:如何用Frida绕过某梆加固的Anti-Frida检测(附完整脚本)

本文深入剖析了企业级加固方案中的Anti-Frida检测机制,并提供了实战对抗策略。通过分析基于文件系统、内存特征、行为及环境的多层次检测原理,文章详细介绍了如何定位检测逻辑、绕过maps文件扫描、对抗内存与行为特征检测,并附上了针对某梆加固的完整绕过脚本与系统化工程方案。

weixin_42527589的博客 601

访问注解(annotation)的几种常见方法

java的注解处理器类主要是AnnotatedElement接口的实现类实现,为位于java.lang.reflect包下。由下面的class源码可知AnnotatedElement接口是所有元素的父接口,这时我们通过反射获得一个类的AnnotatedElement对象后,就可以通过下面表格的几个方法,访问Annotation信息。 public final class Class<T...

weixin_30697239的博客 665

10分钟快速搭建OpenClaw(基于Windows+飞书)

OpenClaw 是一款功能强大的 AI 智能体工具,能够帮助用户管理邮件、日历等日常事务。本文详细介绍了在 Windows11 系统上安装和配置 OpenClaw 的完整步骤,包括 Node.js 环境搭建、Git 安装、OpenClaw 部署以及飞书机器人创建与对接。通过简单的命令行操作和可视化界面配置,用户可以快速完成 AI 助手部署,实现智能办公自动化。文中还提供了飞书机器人权限设置等关键环节的图文指引,帮助用户轻松完成系统集成。

Hello, New World! 2928

java 注解数组初始化_javaSE第十三部分 Java注解

注解(Annotation)是放在Java源码的类、方法、字段、参数前的一种特殊“注释”。注解是JDK1.5及以后版本引入的一个特性,与类、接口、枚举是在同一个层次。它可以声明在类、方法等的前面,用来对这些元素进行说明,注释。与注释不同的是,注释会被编译器直接忽略,注解则可以被编译器打包进入class文件,因此,注解是一种用作标注的“元数据”。从JVM的角度看,注解本身对代码逻辑没有任何影响,如何...

weixin_30022703的博客 369

Proteus 8.9仿真五路抢答器:从74LS148编码到NE555报警的保姆级电路拆解

本文详细解析了使用Proteus 8.9仿真五路抢答器的完整设计流程,从74LS148优先编码器到NE555定时报警电路。通过保姆级的电路拆解和芯片选型指南,帮助读者掌握数字电路中的编码、锁存、译码和定时等核心技术,实现稳定可靠的抢答系统仿真。

weixin_30836759的博客 381

抖音小程序开发 唤起收银台支付(可以选择支付宝APP支付或微信H5支付)

什么都别说,先看效果: 字节跳动也开放了小程序给商家接入,可以在旗下APP如抖音、今日头条、今日头条极速版等应用中即点即用,基于庞大的数亿用户量为其引流,帮助商家获取用户流量,销售商品,其模式和微信小程序差不多。 1、后台管理地址: https://developer.toutiao.com/ 2、开发文档地址: https://developer.toutiao.com/dev/cn/min...

悟空码字的博客 1万+

java 注解 数组_Java 5到11新特性超详细总结,附最新Java学习资料和视频教程

java51.泛型 (Generics) List list=new ArrayList();2.增强循环(Enhanced for Loop)3.自动封箱拆箱(Autoboxing/Unboxing )。八大基本类型和它们的包装类能够自动的相互转换。4.枚举(Typesafe Enums)。ps:枚举是一种实现线程安全的单例模式的好方式。5.可变参数 (Varargs)语法:(type... a...

weixin_33503186的博客 207

【STM32系统】基于STM32设计的锂电池电量/电压检测报警器系统

本设计旨在研究一个基于STM32F103C8T6微控制器的锂电池电量/电压检测报警器系统,应用于便携式电子设备电池管理。系统通过STM32的ADC模块对18650锂电池电压进行采集,利用LCD1602显示模块实时显示电池电压,当检测到电池电量不足或电压异常时,蜂鸣器报警模块会发出警报提醒用户。系统采用简单的硬件结构和优化的软件架构,通过对实际电池电压数据的检测、处理和显示,实现了低功耗、实时监测的锂电池管理功能。本文将介绍系统的设计原理、硬件电路、软件实现以及调试测试过程。

嵌入式阿齐Archie 1万+

Java自定义Annotation注解开发详解

Java自定义Annotation注解开发详解,包含Annotation Processor的使用介绍

DevCampsite的博客 2205

YOLOv8【第一章:基础入门篇·第1节】一文搞定,核心架构深度解析与环境配置!

🏆 本文收录于 《YOLOv8实战:从入门到深度优化》 专栏,该专栏专注于分享我在YOLOv8目标检测模型中的实战经验,涵盖从入门基础到深度优化的全方位解决方案。无论你是计算机视觉的新手,还是具有多年深度学习经验的专家,本专栏都将为你提供高效、可复现的技术方案,助你掌握YOLOv8的核心技术,提升目标检测性能,突破瓶颈,优化模型,并加速项目开发🚀!

**My Coding Family** 2106

工业级稳定!C# 实现 Modbus RTU 多设备并发通信实战

摘要:本文提出一种基于C#的Modbus RTU多设备并发通信方案,解决工业自动化中单线程通信的串口抢占、数据阻塞等问题。采用任务队列+线程安全锁+异步调度的三层架构,实现16台及以上RTU设备的稳定并发读写。方案包含串口管理单例、Modbus通信核心和任务调度层,支持超时重试、异常捕获等工业级容错机制。通过NModbus库和.NET框架,提供可直接用于工业现场的代码实现,已在工控项目中长期验证,有效提升多设备通信效率和稳定性。

这里只有干货:从 Modbus 通信到 MES 对接,从 YOLO 训练到工控机部署,带你搞定工业软件开发全流程。 581

深入JAVA注解(Annotation):自定义注解

一、基础知识:元注解 要深入学习注解,我们就必须能定义自己的注解,并使用注解,在定义自己的注解之前,我们就必须要了解Java为我们提供的元注解和相关定义注解的语法。 元注解:   元注解的作用就是负责注解其他注解。Java5.0定义了4个标准的meta-annotation类型,它们被用来提供对其它 annotation类型作说明。Java5.0定义的元注解:     1.@Targe...

yjclsx的博客 46万+

前端技能树,面试复习第 54 天—— 手写代码:情景题

前端修罗场提供全网最专业的前端优质文章与社区服务,为应届生,初中级前端工程师提供全面、优质的面试服务、技能提升、职场解惑服务!内容包含:前端面试辅导,前端面试题,前端交流,前端答疑,前端基础知识,前端知识体系,技能树搭建,Javascript,CSS,CSS3,HTML,React,Vue,小程序,前端简历,职业交流,远程工作,英文交流,英文提升,外企,互联网,国企,大厂,牛客面试题,掘金面试题,面经,优质前端文章分享...

前端进阶之路 | 中大厂、外企、国企内推 | 面试培训 | 简历修改 987

深入理解Java:注解(Annotation)自定义注解入门

自定义注解与反射 文章目录自定义注解与反射注解的定义元注解的源码位置元注解解析及实例@Documented@Inherited@Target@Retention自定义注解定义标记需要使用元注解自定义注解实例(如果想知道使用的话看这里) 注解的定义 Java注解又称Java标注,是JDK5.0版本开始支持加入源代码的特殊语法元数据。 Java语言中的类、方法、变量、参数和包等都可以被标注。和Javadoc不同,Java标注可以通过反射获取标注内容。在编译器生成类文件时,标注可以被嵌入到字节码中。Java

u010913170的博客 194

Data-Structures-and-Algorithm-Analysis-in-Java.pdf

作者: Weiss, Mark A. 出版社: Addison Wesley Data Structures and Algorithm Analysis in Java is an “advanced algorithms” book that fits between traditional CS2 and Algorithms Analysis courses. In the old ACM Curriculum Guidelines, this course was known as CS7. This text is for readers who want to learn good programming and algorithm analysis skills simultaneously so that they can develop such programs with the maximum amo...

IDEA的使用指南

IDEA基于java的使用手册,可以最快速的上手,在使用中不断的丰富自己的使用技巧.

Java基础之注解186 什么是Annotation187 自定义Annotation188反射读取注解信息与定义注解的注解

目录 1、认识Annotation 2、系统定义的Annotation 3、自定义Annotation 4、Retention和RetentionPolicy 5、反射与Annotation 6、@Documented注解 7、@Target注解 8、@Inherited注解 1、认识Annotation JDK1.5开始,Java增加了对元数据(即类的组成单元数据)的支持,也就是(Annota...

C_time的博客 333

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

Java自定义注解Annotation

文章目录前言一、什么是注解?1. 简介2. 一些常见的注解二、为什么要使用注解?1.XML 与 Annotation2.XML 的优缺点3.Annotation 的优缺点三、怎样使用自定义注解?1.元注解2.注解的内容3.自定义注解总结 前言 在开发的过程中,经常会见到一些注解,有时候还需要自定义一些注解来达到我们所期望的效果。那么什么是注解?为什么要使用注解?怎样使用注解?我们今天就来探讨一下。 一、什么是注解? 1. 简介 Java 注解是在 JDK5 时引入的新特性,注解(也被称为元数据)为我们在

qq_43610090的博客 295

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

java 自定义 annotation_JAVA中如何定义自定义注解

了解注解注解是Java1.5,JDK5.0引用的技术,与类,接口,枚举处于同一层次 。它可以声明在包、类、字段、方法、局部变量、方法参数等的前面,用来对这些元素进行说明,注释 。在Java中,自带了三种注解,这三种注解存在于java.lang包中,首先我们讲一讲这些注解Override——它的作用是对覆盖超类中方法的方法进行标记,如果被标记的类并没有实际覆盖超类,则编译器会发出错误警告。很常见的一...

weixin_42497772的博客 199

Java注解Annotation的用法 - 自定义Annotation实现

Java注解又称Java标注,是Java语言5.0版本开始支持加入源代码的特殊语法元数据。 Java语言中的类、方法、变量、参数和包等都可以被标注。和Javadoc不同,Java标注可以通过反射获取标注内容。在编译器生成类文件时,标注可以被嵌入到字节码中。Java虚拟机可以保留标注内容,在运行时可以获取到标注内容。 当然它也支持自定义Java标注。 Java 平台有许多特别的注解,例如tra...

坐看云起时_雨宣 8366

Java自定义注解Annotation详解

简介开发中经常使用到注解,在项目中也偶尔会见到过自定义注解,今天就来探讨一下这个注解是什么鬼,以及注解的作用和自定义注解。列举开发中常见的注解 @Override:当重写父类的方法时一般都会在方法上标注上此注解(我们最经常看到的toString()方法上总能看到这货) @Deprecated:用于标记某个方法已经过期,请使用新的方法来替代已经废弃的方法 @SuppressWarnings:让编译器或

人不风流枉少年 3万+

java 自定义Annotation注解

如果自定义注解没有成员,表明是一个标识;如果注解有成员,在使用注解时必须指定成员的值。定义新的注解类型使用@interface自定义注解自动继承java.lang.annotation.Annotation接口注解的成员变量类型可以是8中基本数据类型、String类型、Class类型、Enum类型、Annotation类型或以上类型的数组。自定义注解必须配上注解的信息处理流程(使用反射)才有意义。

银河系天城知识宝库_技术专家蒋浩宇 1609

java自定义Annotation,得到注解类中Annotation设定的注解值

注解类中Annotation设定的注解值

nobody 3999

Java 注解Annotation 和自定义注解

注解Annotation 和自定义注解 本文仅作为个人复习学习,枚举知识点使用。 本篇大部分内容结合了 优快云博主「程序媛 泡泡」文章,如有喜欢本文内容的读者,请前往原作者页面支持原作者 原文链接:https://blog.youkuaiyun.com/weixin_43884234/article/details/115055781 1. 关于注解 注解可以增强我们的Java 代码,同时利用反射技术可以扩充实现很多功能。它们被广泛的应用于三大框架底层。 现在主流的开发都是基于注解方式。代码量少,框架可以根据

白嫖怪的博客 170

Java面试-注解(Annotation)原理与自定义注解实战

在 Java 的宇宙中,注解是元数据的低语它不改变代码逻辑,却能操控编译器与运行时。它说:‘我是代码的注释,也是框架的开关,更是 AOP 的利刃!这,就是反射与字节码的共舞!元注解是“注解的注解”,用于定义自定义注解的行为。

千淘万漉虽辛苦,吹尽狂沙始到金 2万+

JAVA自定义注解(Annotation)及元注解

JAVA注解

Ron_的博客 8936
上一篇: HTTP状态码
下一篇: 资源池设计模式 (Resource Pool)和数据池的简单实现
七郎
博客等级 码龄14年 31粉丝 44原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值