我們都知道作為一名程序員,經(jīng)常進(jìn)行代碼注釋是一種很好的習(xí)慣。但你的后臺(tái)代碼需要更改的時(shí)候,我們不需要將整片的代碼進(jìn)行改寫,那么這個(gè)時(shí)候,注釋就顯得重要了。它能幫你快速找到需要修改的區(qū)域,也不用一行一行的去尋找。其實(shí)Java注釋還有一個(gè)故事,一個(gè)你不知道的故事。
1.XML大臣
最近這幾年,XML大臣的宅邸車水馬龍,像什么Spring, Hibernate, MyBatis 等大大小小的官員進(jìn)京來(lái)都要拜訪一下,無(wú)數(shù)的冰敬碳敬悄悄地送入府中, 真可謂紅極一時(shí), 正處于人生巔峰。 原因很簡(jiǎn)單,Java帝國(guó)的配置文件幾乎都在使用XML, 自然都?xì)wXML大臣管理,想不紅都難!
其他大臣看在眼里,恨在心里,他們決定聯(lián)合起來(lái),堅(jiān)決打擊XML大臣的囂張氣焰, 堅(jiān)決把白花花的銀子轉(zhuǎn)移到自己府中來(lái)。 幾位老家伙商量以后,決定還是推舉老成持國(guó)的IO大臣為首領(lǐng),給XML大臣一點(diǎn)顏色瞧瞧。
2.安翰林獻(xiàn)計(jì)
可是IO大臣想了半天,也沒什么好辦法。
這一天有個(gè)姓安的翰林自報(bào)家門求見, 說(shuō)是可以助IO大臣一臂之力。
“安大人有何見教?” IO大臣懶洋洋地問(wèn)道,他對(duì)這些讀死書的翰林們沒什么好感。
“大人,下官在負(fù)責(zé)Java注解,對(duì)付XML大臣,也許是個(gè)突破口”
“注解? 這是什么東西?” IO大臣確實(shí)是有點(diǎn)老了
“其實(shí)就是元數(shù)據(jù)了”
“元數(shù)據(jù)?” IO大臣一頭霧水。
“嗯, Metadata” 安翰林把英文都整出來(lái)了。
“賣它推它?” IO大臣明顯英文不好。
旁邊的幕僚一個(gè)勁兒的使眼色, 諄諄告誡安翰林要通俗易懂。
安翰林說(shuō): “大人肯定知道@Override,@SuppressWarning等注解吧? ”
IO大臣點(diǎn)頭。
安翰林接著說(shuō): “所謂元數(shù)據(jù), 就是描述數(shù)據(jù)的數(shù)據(jù)了,換句話說(shuō)可以給其他數(shù)據(jù)提供描述性信息, 例如Java類中的某個(gè)方法,可以認(rèn)為是一種數(shù)據(jù), 如果我的@Override 一旦被用到這個(gè)方法上,那就意味著要覆蓋父類/接口的方法了,于是我的@Override 就給這個(gè)方法提供了額外的信息?!?/p>
“但是在源代碼中寫個(gè)@Override 似乎也沒什么用處啊? ” IO大臣問(wèn)道
“所以這只是元數(shù)據(jù), 它給其他數(shù)據(jù)(如Java方法)提供了信息, 但是怎么樣利用這些信息那就不歸我管了?!?/p>
“那歸誰(shuí)管?”
“比如@Override , 由編譯器來(lái)管,當(dāng)編譯這個(gè)Java 文件的時(shí)候,它就會(huì)檢查被@Override 修飾的方法是否和父類的方法和參數(shù)相同, 如果不同,就會(huì)報(bào)錯(cuò)了。”
IO大臣說(shuō): “奧,明白了,所謂的注解有點(diǎn)像加強(qiáng)版的注釋, 這個(gè)“注釋”不但有一定的格式,還有特定的含義,這樣別的工具就可以讀取它來(lái)做事情了!”
安翰林松了一口氣, 心里暗自佩服IO大臣的總結(jié)能力。
“我記得這個(gè)@Override注解很早就有了啊,好像是JDK1.4吧”
“沒錯(cuò), 之前JDK內(nèi)置了@Override、@Deprecated 、@SuppressWarnings等注解, 但是用處不大, 下官有個(gè)想法,干脆允許臣民們自定義注解得了” 安翰林開始切入正題。
“自定義? 就是讓臣民們自己寫? ”
“是的大人, 比如我可以自定義一個(gè)叫做 @Test的 注解:” 安翰林說(shuō)著把寫好的代碼呈了上去。
安翰林接著說(shuō): 大人請(qǐng)看我這里定義了一個(gè)叫做Test的注解,它有個(gè)ignore方法, 一會(huì)兒您老就看到它的用途了, 這個(gè)注解是應(yīng)用在方法上的 @Target(ElementType.METHOD), 在運(yùn)行時(shí)起作用@Retention(RetentionPolicy.RUNTIME)。
IO大臣問(wèn)道:“稍等, 我怎么還看到了@Target,@Retention, 這是什么? ”
“這稱為元注解,可以認(rèn)為是注解的注解?!?安翰林嘿嘿一笑說(shuō) “@Target表示該注解的應(yīng)用目標(biāo),可以是類、方法、 方法參數(shù)等等, @Retention表示這個(gè)注解要保留到什么時(shí)候, 可以只在源碼中, 或者class 文件中, 或者是運(yùn)行時(shí)。”
“ 注解的注解, 真是夠拗口的啊, 這個(gè)自定義的注解@Test 該怎么使用呢? ”
安翰林又展示了另外一段代碼:
IO大臣看了下,心想這自定義的注解和JDK內(nèi)置的注解都差不多嘛,@Test修飾了方法, 表示這個(gè)方法可以作為測(cè)試用例來(lái)運(yùn)行, @Test(ignore=true)則表示雖然這是個(gè)測(cè)試方法, 但是暫時(shí)忽略,不用運(yùn)行, 果然簡(jiǎn)潔而清爽,老夫真是小看了這個(gè)安翰林。
“@Test注解的定義和使用,只是定義了行為語(yǔ)義,怎么樣實(shí)現(xiàn)這個(gè)行為呢? ” IO大臣問(wèn)道
安翰林早有準(zhǔn)備:“大人請(qǐng)看,我可以在運(yùn)行時(shí)通過(guò)反射的方式取出把方法的注解,如果這個(gè)注解是@Test, 并且沒有被ignore , 那就可以通過(guò)反射去執(zhí)行這個(gè)方法了, 是不是很簡(jiǎn)單?”
IO大臣微微點(diǎn)了點(diǎn)頭,表示贊同,接著便閉目陷入了沉思: 這個(gè)東西有點(diǎn)意思,在一個(gè)方法上添加了簡(jiǎn)單的修飾性注解@Test以后,這個(gè)方法突然間就有了額外的語(yǔ)義,變成了可以執(zhí)行的測(cè)試用例了 !
如果是XML老頭兒, 該怎么描述類似的行為呢? 也許得這樣:
相比于簡(jiǎn)潔的@Test注解,這個(gè)方式實(shí)在是太復(fù)雜了, 更重要的是每次增加新的方法,除了修改Java文件之外,還得記著修改這個(gè)XML文件, 實(shí)在是繁瑣。
嗯, 看來(lái)這個(gè)注解確實(shí)是個(gè)殺手锏, 要謹(jǐn)慎使用,一擊必中。
想到這里,IO大臣睜開眼睛,喜笑顏開,讓安翰林寫一個(gè)關(guān)于注解的詳細(xì)奏章,自己在合適的時(shí)候呈給皇上。
3.早朝爭(zhēng)斗
初六陽(yáng)光燦爛,IO大臣看到早朝的皇上心情不錯(cuò),就把奏章呈了上去。
“注解? 這是什么東西?” 皇上根本沒心思了解細(xì)節(jié)。
“啟奏陛下,這個(gè)注解能夠部分的代替一些XML的配置工作” IO大臣一邊小心翼翼地回復(fù),一邊用余光向XML大臣掃去。
看到IO大臣向自己發(fā)難, XML大臣立刻警覺起來(lái), 他馬上說(shuō): “陛下,可否讓老臣一觀?”
皇帝示意讓呂公公把奏章遞給XML大臣。
XML大臣看了一會(huì)兒就明白大事不好, 這簡(jiǎn)直是釜底抽薪, 如果這個(gè)帝國(guó)批準(zhǔn)了這個(gè)玩意兒,允許臣民們自定義注解,自己的勢(shì)力要大大地被削弱了。
XML大臣腦海中出現(xiàn)一副可怕的場(chǎng)景, Spring, Struts, Hibernate 等紛紛倒戈,都采用注解來(lái)進(jìn)行系統(tǒng)配置,白花花的銀子開始流向IO大臣的府邸。。。。。。
不, 堅(jiān)決要把這點(diǎn)星星之火迅速撲滅。
“陛下,依老臣之見, 此法斷不可行!” XML大臣斬釘截鐵。
“為何不可行? 使用注解,配置靠近代碼,容易閱讀、容易修改!” IO大臣立刻反擊, 為了展示易讀易改,IO大臣還現(xiàn)場(chǎng)寫了一段代碼,描述了一個(gè)普通的Java 類是如何向數(shù)據(jù)庫(kù)表和列映射的。 朝中多位大臣齊聲喝彩, 為IO大臣搖旗吶喊。
“單獨(dú)看一個(gè)當(dāng)然很清晰, 但是如果多了, 配置分散在各個(gè)Java文件中, 極難查找,到時(shí)候你哭都來(lái)不及, 如果你用了XML, 所有的配置集中在一處, 一目了然。 還有,如果你想修改配置就得改Java源文件,重新編譯部署,這也太扯了吧?!” XML大臣不甘示弱。
眼看著兩位重臣開始劍拔弩張, 皇帝決定出面和稀泥, 他也不希望一家獨(dú)大,也想平衡一下朝中關(guān)系。
“兩位愛卿,依朕之意,還是先在JDK中加入自定義注解的支持,至于是用注解還是用XML, 還是讓朕的子民們?nèi)ミx擇吧! ”
看到皇上主意已定, 兩位大臣只好退下。
自定義注解發(fā)布了, 令大家沒有想到的是,無(wú)論是注解還是XML配置都沒有占據(jù)壟斷地位,很多人把二者混合起來(lái)使用了! 對(duì)于一些需要集中配置的場(chǎng)合,例如數(shù)據(jù)源的配置, 自然是用XML。 另外一方面對(duì)于@Controller, @RequestMapping, @Transactional 這樣的注解 , 大家更喜歡和Java方法寫在一起,顯得簡(jiǎn)單而直觀。
這正如朝中的局勢(shì),沒人能夠一家獨(dú)大,XML大臣雖然丟失了一些領(lǐng)地,但依然是不可忽視的力量。 一場(chǎng)爭(zhēng)斗,唯一的大贏家可能就是安翰林了,他被任命為Annotation大臣,專門管理自定義的注解。
評(píng)論