Java注解是怎么成功上位的?

软件测试面试题汇总 软件测试面试题汇总 测试技术面试题 ........................................................................................................................................................................ 5 1、什么是兼容 阅读详情

1

XML大臣

最近这几年,XML大臣的宅邸车水马龙,像什么Spring, Hibernate, MyBatis 等大大小小的官员进京来都要拜访一下,无数的冰敬碳敬悄悄地送入府中, 真可谓红极一时, 正处于人生巅峰。 原因很简单,Java帝国的配置文件几乎都在使用XML, 自然都归XML大臣管理,想不红都难!

其他大臣看在眼里,恨在心里,他们决定联合起来,坚决打击XML大臣的嚣张气焰, 坚决把白花花的银子转移到自己府中来。  几位老家伙商量以后,决定还是推举老成持国的IO大臣为首领,给XML大臣一点颜色瞧瞧。 

2

安翰林献计

可是IO大臣想了半天,也没什么好办法。  

这一天有个姓安的翰林自报家门求见, 说是可以助IO大臣一臂之力。

“安大人有何见教?”  IO大臣懒洋洋地问道,他对这些读死书的翰林们没什么好感。

“大人,下官在负责Java注解,对付XML大臣,也许是个突破口”

“注解? 这是什么东西?”  IO大臣确实是有点老了

“其实就是元数据了”

“元数据?”  IO大臣一头雾水。

“嗯, Metadata”   安翰林把英文都整出来了。 

“卖它推它?”  IO大臣明显英文不好。

旁边的幕僚一个劲儿的使眼色, 谆谆告诫安翰林要通俗易懂。

安翰林说: “大人肯定知道@Override,@SuppressWarning等注解吧? ”

0?wx_fmt=png

IO大臣点头。

安翰林接着说: “所谓元数据, 就是描述数据的数据了,换句话说可以给其他数据提供描述性信息, 例如Java类中的某个方法,可以认为是一种数据, 如果我的@Override 一旦被用到这个方法上,那就意味着要覆盖父类/接口的方法了,于是我的@Override 就给这个方法提供了额外的信息。”

 “但是在源代码中写个@Override 似乎也没什么用处啊? ”  IO大臣问道

 “所以这只是元数据,  它给其他数据(如Java方法)提供了信息, 但是怎么样利用这些信息那就不归我管了。” 

 “那归谁管?” 

“比如@Override , 由编译器来管,当编译这个Java 文件的时候,它就会检查被@Override 修饰的方法是否和父类的方法和参数相同, 如果不同,就会报错了。”

IO大臣说: “奥,明白了,所谓的注解有点像加强版的注释, 这个“注释”不但有一定的格式,还有特定的含义,这样别的工具就可以读取它来做事情了!”

安翰林松了一口气, 心里暗自佩服IO大臣的总结能力。 

“我记得这个@Override注解很早就有了啊,好像是JDK1.4吧”

“没错,  之前JDK内置了@Override、@Deprecated 、@SuppressWarnings等注解, 但是用处不大, 下官有个想法,干脆允许臣民们自定义注解得了”  安翰林开始切入正题。

“自定义? 就是让臣民们自己写? ”

“是的大人, 比如我可以自定义一个叫做 @Test的 注解:”  安翰林说着把写好的代码呈了上去。 

0?wx_fmt=png

安翰林接着说: 大人请看我这里定义了一个叫做Test的注解,它有个ignore方法, 一会儿您老就看到它的用途了, 这个注解是应用在方法上的 @Target(ElementType.METHOD), 在运行时起作用@Retention(RetentionPolicy.RUNTIME)。

IO大臣问道:“稍等, 我怎么还看到了@Target,@Retention, 这是什么? ”

 “这称为元注解,可以认为是注解的注解。” 安翰林嘿嘿一笑说  “@Target表示该注解的应用目标,可以是类、方法、 方法参数等等, @Retention表示这个注解要保留到什么时候, 可以只在源码中, 或者class 文件中, 或者是运行时。”

“ 注解的注解, 真是够拗口的啊, 这个自定义的注解@Test 该怎么使用呢? ”

安翰林又展示了另外一段代码:

0?wx_fmt=png

IO大臣看了下,心想这自定义的注解和JDK内置的注解都差不多嘛,@Test修饰了方法, 表示这个方法可以作为测试用例来运行, @Test(ignore=true)则表示虽然这是个测试方法, 但是暂时忽略,不用运行, 果然简洁而清爽,老夫真是小看了这个安翰林。

“@Test注解的定义和使用,只是定义了行为语义,怎么样实现这个行为呢?  ” IO大臣问道

安翰林早有准备:“大人请看,我可以在运行时通过反射的方式取出把方法的注解,如果这个注解是@Test, 并且没有被ignore , 那就可以通过反射去执行这个方法了, 是不是很简单?”

0?wx_fmt=png

IO大臣微微点了点头,表示赞同,接着便闭目陷入了沉思: 这个东西有点意思,在一个方法上添加了简单的修饰性注解@Test以后,这个方法突然间就有了额外的语义,变成了可以执行的测试用例了 !

如果是XML老头儿, 该怎么描述类似的行为呢?  也许得这样:

0?wx_fmt=png

相比于简洁的@Test注解,这个方式实在是太复杂了, 更重要的是每次增加新的方法,除了修改Java文件之外,还得记着修改这个XML文件, 实在是繁琐。

嗯, 看来这个注解确实是个杀手锏, 要谨慎使用,一击必中。

想到这里,IO大臣睁开眼睛,喜笑颜开,让安翰林写一个关于注解的详细奏章,自己在合适的时候呈给皇上。 

3

早朝争斗

初六阳光灿烂,IO大臣看到早朝的皇上心情不错,就把奏章呈了上去。 

“注解? 这是什么东西?”  皇上根本没心思了解细节。

“启奏陛下,这个注解能够部分的代替一些XML的配置工作”  IO大臣一边小心翼翼地回复,一边用余光向XML大臣扫去。 

看到IO大臣向自己发难, XML大臣立刻警觉起来, 他马上说: “陛下,可否让老臣一观?”

皇帝示意让吕公公把奏章递给XML大臣。 

XML大臣看了一会儿就明白大事不好, 这简直是釜底抽薪, 如果这个帝国批准了这个玩意儿,允许臣民们自定义注解,自己的势力要大大地被削弱了。

XML大臣脑海中出现一副可怕的场景, Spring, Struts, Hibernate 等纷纷倒戈,都采用注解来进行系统配置,白花花的银子开始流向IO大臣的府邸......

不, 坚决要把这点星星之火迅速扑灭。 

“陛下,依老臣之见, 此法断不可行!”  XML大臣斩钉截铁。

“为何不可行?  使用注解,配置靠近代码,容易阅读、容易修改!”  IO大臣立刻反击, 为了展示易读易改,IO大臣还现场写了一段代码,描述了一个普通的Java 类是如何向数据库表和列映射的。 朝中多位大臣齐声喝彩,  为IO大臣摇旗呐喊。

0?wx_fmt=png

“单独看一个当然很清晰, 但是如果多了, 配置分散在各个Java文件中, 极难查找,到时候你哭都来不及, 如果你用了XML, 所有的配置集中在一处, 一目了然。 还有,如果你想修改配置就得改Java源文件,重新编译部署,这也太扯了吧?!” XML大臣不甘示弱。

眼看着两位重臣开始剑拔弩张, 皇帝决定出面和稀泥, 他也不希望一家独大,也想平衡一下朝中关系。

“两位爱卿,依朕之意,还是先在JDK中加入自定义注解的支持,至于是用注解还是用XML, 还是让朕的子民们去选择吧!  ”

看到皇上主意已定, 两位大臣只好退下。 

自定义注解发布了, 令大家没有想到的是,无论是注解还是XML配置都没有占据垄断地位,很多人把二者混合起来使用了!  对于一些需要集中配置的场合,例如数据源的配置, 自然是用XML。 另外一方面对于@Controller, @RequestMapping, @Transactional 这样的注解 , 大家更喜欢和Java方法写在一起,显得简单而直观。

这正如朝中的局势,没人能够一家独大,XML大臣虽然丢失了一些领地,但依然是不可忽视的力量。 一场争斗,唯一的大赢家可能就是安翰林了,他被任命为Annotation大臣,专门管理自定义的注解。 

(完)

你看到的只是冰山一角, 更多精彩文章,请移步《码农翻身2016文章精华》或者《码农翻身2017上半年文章精华》

有心得想和大家分享? 欢迎投稿 ! 我的联系方式:微信:liuxinlehan  QQ: 3340792577


码农翻身

用故事讲述技术

0.jpeg

linux内核学习(一)---内核社区介绍及补丁提交 本系列开始会对linux内核进行系统性的学习,以源码与内核社区为基础,了解前沿的内核机制,同时也深度了解linux内核中的一些经典机制 本章会先对linux内核社区进行简单的介绍,包括源码下载、内核社区的修改提交 阅读详情

相关推荐

第1关:STL模板之queue实例一:最少个数

头歌自创答案

xiyunSacire的博客 819

读码农翻身之java注解

1、为什么需要java注解? xml配置方式太过于复杂繁琐? 2、什么是注解? 所谓的注解有点像加强版的注释,这个注释不但有一定的格式,还有特定的含义。这样别的工具就可以读取它来做事情了。 3、如何使用注解? 如下所示,@Test这个注解,当@Test修饰了方法,表示这个方法可以作为测试用例来运行。 而在运行时,可以通过反射的方式取出方法的注解,然后通过反射去执行这个方法。 ...

夏季版 274

深入解析Xilinx IDELAYE2在FPGA时序优化中的关键作用与实战配置

本文深入解析了Xilinx FPGA中IDELAYE2模块在时序优化中的关键作用。作为精密的信号延时微调器,IDELAYE2通过可编程的抽头延迟,有效解决高速接口中数据与时钟的相位偏差问题。文章详细阐述了其必须与IDELAYCTRL配对使用的核心机制,并对比分析了FIXED、VARIABLE和VAR_LOAD三种工作模式的实战配置方法与代码示例,为FPGA工程师提供了解决时序收敛难题的关键硬件配置指南。

pear55的博客 1184

我把这两年的精华文章都整理出来了

应读者要求,把码农翻身的所有文章做了一个分类,方便大家出查找,欢迎转发,分享。该目录持续更新中,在公众号首页发送消息“目录”,可以看到最新版。想通过关键字搜索的,可以点...

码农翻身 770

2025.06.20【pacbio】|PB甲基化分析结果的统计与可视化介绍

本文介绍了PacBio甲基化数据的统计分析与可视化方法。主要内容包括:1) 分析甲基化位点分布、比例及染色体分布;2) 修饰基序(Motif)的统计与热图展示;3) 全基因组和局部区域测序深度可视化;4) 使用IGV查看单个reads修饰情况。文章提供了R代码示例,涵盖柱状图、分布图、热图等多种可视化形式,并建议了差异甲基化分析等进阶方法,帮助科研人员深入挖掘甲基化数据。

2067

用V E S C 6-M K V I 第六代调速控制器给VESC电调刷固件

文章摘要:本文介绍了一款先进的电机控制器,具备多项创新技术。核心亮点包括三相电流/电压检测、四象限无缝运行、多模式兼容等先进电机控制技术,以及智能感知与安全保护、高效能电源管理、多样化连接与扩展功能。此外,该控制器支持实时数据监测与用户交互,具备开源生态和工业级可靠性,适用于电动载具、机器人及工业领域。用户需注意散热要求和兼容性提示,可通过VESC-Tool软件进行灵活配置。产品可在常竹科技淘宝店购买,并加入技术交流群获取支持。

2403_89422757的博客 1367

《码农翻身》总结整理

最近突然想把自己读过的一些书总结一下,做个记录。 《码农翻身》是我毕业之后认真读过的第一本书,从此之后一发不可收拾,上网买了一堆博客大神推荐的书,读完之后也有自己的一些总结,后面会陆续补上。 《码农翻身》这本书的特点是用有趣的故事,通俗易懂的语言来描述计算机的世界,涉及的范围和内容都是一些常用的知识,从底层操作系统,到数据库,再到java语言以及JavaWeb技术,以及代码管理等等...

jzjsqrzjzj的博客 1284

【2022网易雷火】游戏研发笔试-AC代码及题目分享

3个小时,4道题目,雷火的题目不在于难,更在于对细节的把控和写大模拟的耐心,花了一个半小时,AC了3.85,直接交卷退了。第一题AC,第二题AC,第三题85%,第四题AC。下面分享一下大致的题意和对应的代码,就不多说了,最近很累(代码可能会有贴错的情况,如有望指正,感谢~)。 T1-小Y抽奖 题意 n行m列个奖励格子,每次抽奖消耗一个道具。每个格子奖励的数量有限且各不相司。每个格子被抽到一次,剩余的奖励数量-1。剩余的奖励数量为0时,则不会再抽到该格子。小Y抽了好多次,但一直没有抽到最想要的..

米莱虾 9266

品Spring:注解终于“成功上位”

历史还是抛弃了XML,当它逐渐尝到注解的甜头之后。 尤其是在Spring帝国,到处充满着注解的气息。 注解从一个提供附属信息的“门客”,蜕变为颇具中流砥柱的“君侯”。 注解成功登上了帝国的舞台,定会像XML一样留下浓墨重彩的一笔。重新认识一下注解 注解其实就是注释、批注的意思。就像看书时在旁边记笔记一样。 如果把书上印刷的内容看作是原始信息,那写上的笔记则是新添加的额外信息,且这个额外信息并...

李新杰的优快云 299

自然语言处理:长文本场景下的关键词抽取实践

自然语言处理:长文本场景下的关键词抽取实践

丨汀、的博客 2077

FFmpeg入门详解之110:RTSP协议讲解

TCP/IP 协议体系中的一个应用层协议,该协议定义了一对多应用程序如何有效地通过 IP 网络传送多媒体数据。RTSP在体系结构上位于RTP和RTCP之上,它使用TCP或UDP完成数据传输。HTTP与RTSP相比,HTTP传送HTML,而RTSP传送的是多媒体数据。正在上传…重新上传取消RTSP是基于文本的协议,采用ISO10646字符集,使用UTF-8编码方案。行以CRLF中断(\r\n:10,13:0x0A,0x0D),包括消息类型、消息头、消息体和消息长。

福优学苑@音视频+流媒体 2529

如何获取注解中的值_品Spring:注解终于“成功上位”

原创文章,首发于公众号:编程新说,作者:李新杰原文地址:https://mp.weixin.qq.com/s/zmuY7VJBDvfF1tFBzx7eyg封面图历史还是抛弃了XML,当它逐渐尝到注解的甜头之后。尤其是在Spring帝国,到处充满着注解的气息。注解从一个提供附属信息的“门客”,蜕变为颇具中流砥柱的“君侯”。注解成功登上了帝国的舞台,定会像XML一样留下浓墨重彩的一笔。重新认识一下注解...

weixin_39813009的博客 485

Spring AI Alibaba实战训练营-28 手把手教你用SAA+ Nacos 构建分布式 MCP 应用

本文介绍如何使用Spring AI Alibaba和Nacos构建分布式MCP应用,实现AI模型与工具服务的动态发现和调用。主要内容包括:1) 项目架构设计,包含MCP Server、Nacos注册中心和MCP Client三个核心组件;2) 环境准备要求,如Java 17+、Maven 3.6+、Nacos 3.1.0+等;3) 详细实施步骤:启动Nacos服务、注册MCP服务端、配置MCP网关聚合服务、设置MCP客户端发现机制。通过这种架构,开发者可以轻松扩展新工具服务,无需修改客户端代码,实现服务动态

program哲学 311

二奶Kotlin上位记

系列文章: 秒懂Kotlin之Java程序员如何快速掌握Kotlin 秒懂Kotlin之协变(Covariance)逆变(Contravariance)与抗变(Invariant) 秒懂Kotlin之彻底弄懂形变注解out与in 秒懂Kotlin之轻松掌握Scope Functions (apply, also,let,run,with) 文章目录概述系出名门上位之路奋发图强 概述 Kotlin 就像个刚进门的多才多艺的小妾,使用各种奇技淫巧把程序员老爷伺候的欲仙欲死,还一直在挑衅正房Java。 老爷:Ja

ShuSheng007的程序人生 710

ssm框架搭建

这个是一个在idea上成功跑起来的ssm框架项目,保存在这里方便以后使用直接下载

lwip-2.0.3

lwip是瑞典计算机科学院(SICS)的Adam Dunkels 开发的一个小型开源的TCP/IP协议栈。实现的重点是在保持TCP协议主要功能的基础上减少对RAM 的占用。

Java注解参数类型枚举值_EffectiveJava-5-枚举和注解

用enum代替int常量1. int枚举:引入枚举前,一般是声明一组具名的int常量,每个常量代表一个类型成员,这种方法叫做int枚举模式。int枚举模式是类型不安全的,例如下面两组常量:性别和动物种类,二者不存在任何关系,然而却可以将ANIMAL_DOG传入一个需要性别参数的方法中,编译器不会出现警告,而且方法内部逻辑还会继续执行比较等操作。采用int枚举模式的程序是十分脆弱的,因为int枚举是...

weixin_34602954的博客 1350

Devexpress16.2.6破解工具

Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具

《Effective Java》第6章 枚举与注解

Jdk 1.5发行版本新增了两个引用类型家族:一种新的类称作枚举类型(enum);另一种新的接口称作注解类型(annotation type)

AnnaLoad的专栏 620

VB摄像头监控

该VB模块可对摄像头捕获的画面进行录像等,可在创建的窗口进行控制

《Effective Java》学习笔记 —— 枚举、注解与方法

  Java的枚举、注解与方法... 第30条 用枚举代替int常量 第31条 用实例域代替序数   可以考虑定义一个final int 代替枚举中的 ordinal() 方法。 第32条 用EnumSet代替位域(bit field)   如果底层的枚举类型不超过64个,则整个 EnumSet 就是用单个 long 来表示,因此性能上比得上位域的性能。 ...

weixin_30437847的博客 238

EffectiveJava-5-枚举和注解

用enum代替int常量 1. int枚举: 引入枚举前,一般是声明一组具名的int常量,每个常量代表一个类型成员,这种方法叫做int枚举模式。 int枚举模式是类型不安全的,例如下面两组常量:性别和动物种类,二者不存在任何关系,然而却可以将ANIMAL_DOG传入一个需要性别参数的方法中,编译器不会出现警告,而且方法内部逻辑还会继续执行比较等操作。 采用int枚举模式的程序是十分脆弱的,因为int枚举是编译时常量,被编译到使用它们的客户端中,如果与枚举常量关联的int值发生变化客户端就必.

o118abcdef的博客 253

effective java 枚举_EffectiveJava-5-枚举和注解

用enum代替int常量1. int枚举:引入枚举前,一般是声明一组具名的int常量,每个常量代表一个类型成员,这种方法叫做int枚举模式。int枚举模式是类型不安全的,例如下面两组常量:性别和动物种类,二者不存在任何关系,然而却可以将ANIMAL_DOG传入一个需要性别参数的方法中,编译器不会出现警告,而且方法内部逻辑还会继续执行比较等操作。采用int枚举模式的程序是十分脆弱的,因为int枚举是...

weixin_35949256的博客 303

枚举和注解(五)

第五章 枚举和注解 补充:编译时常量 int枚举模式与String枚举模式的缺点:类型安全性、使用方便性 枚举类型避免了这些缺点,并且提供许多额外的好处:编译时的类型安全、单例泛型化、有自己的命名空间、导出常量的域在枚举类型和它的客户端之间提供了一个隔离层、还可以添加任意的方法和域 为了将数据与枚举常量关联起来,得声明实例域,并编写一个带有数据并将数据保存在

shaochengchengip的专栏 672

java基于ssm的渔业标准内容服务系统

软件编程是孤独的,也是枯燥的。在外行看似简单的一个操作,背后却是数以百行的代码,有时一个项目的开发甚至需要连续十几天甚至一个月。SSM项目即采用Spring+SpringMVC+Mybatis编写实现的项目, SpringMVC是Spring框架家族自带的mvc框架, 其设计思想非常先进, 只需要简单通过若干注解便可以进行接口和页面的编写, 并天生与Spring整合, 实现依赖注入的功能, mybatis是一个比较常用的java持久层框架, 通过xml描述来批量的管理项目里的sql, 非常简易而强大。

qq_840612233的博客 160

全新的网络加载框架Retrofit2,上位的小三

前言:  纪念这个明天比昨天更好的时代,纪念这个二胎开放的时代,对于技术日新月累的今天,各种新的网络技术也层数不穷,从老牌的HttpClient,那时还不能称之为框架;到android-async-http,再到如今的老将Volley;曾几何时,正是Xutils,Afindl等大而全的框架盛行其道的时候,如今也已经褪去了往日的辉煌,留下了无尽的悔恨暗暗孤独终老;如今新的网络框架诸如Okhttp,Re

戴定康的博客 1250

Effective Java 枚举和注解 第32条:用 EnumSet 代替位域

如果一个枚举类型的元素主要用在集合中,一般就是用 int 枚举模式(见第30条),将 2 的不同倍数赋予每个常量: // Bit field enumeration constants - OBSOLETE! public class Text { public static final int STYLE_BOLD = 1 << 0; // 1 ...

yancyang的博客 2364

Effective Java 阅读笔记——枚举和注解

30:用enum代替int常量 当需要一组固定常量的时候,应该使用enum代替int常量,除了对于手机登资源有限的设备应该酌情考虑enum的性能弱势之外。 31:用实例域代替序数 应该给enum添加int域,而不是使用ordinal方法来导出与枚举关联的序数值。(几乎不应使用ordinal方法,除非在编写像EnumMap这样的基于枚举的通用数据结构) //WRONG public e...

weixin_30564785的博客 180
上一篇: Java帝国之动态代理
下一篇: 纪念我最有效率的一次加班
码农翻身
码农翻身 《码农翻身》作者 《码农翻身》作者
博客等级 码龄8年 3万+粉丝 1084原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值