注解在JavaSE中算是比較高級的一種用法了,為什么要學(xué)習(xí)注解尊浪,我想大概有以下幾個原因:
1. 可以更深層次地學(xué)習(xí)Java匣屡,理解Java的思想.
2. 有了注解的基礎(chǔ)涩拙,能夠方便閱讀各種框架的源碼,比如hibernate耸采,SpringMVC等等兴泥。里面就用到了大量的注解。即便無法閱讀源碼虾宇,以后使用這些框架搓彻,會有一種心理上的安全感。
3. 方便今后跟別人吹牛嘱朽。(當(dāng)然旭贬,這也很重要。)
好了搪泳,話不多說稀轨,我們開始吧。
1. 從注釋的角度來理解注解
我想了很久岸军,最終決定以這個小標(biāo)題作為第一節(jié)的標(biāo)題奋刽,我們在編寫Java代碼的時候,為了讓我們的代碼看起來通俗易懂艰赞,就會加上注釋信息佣谐。
比如,我們寫一個方法方妖,會標(biāo)注上這個方法的作者狭魂,作用,版本等信息党觅。是的雌澄,作為一個程序員,編寫優(yōu)雅的注釋是一個非常重要的好習(xí)慣杯瞻。
例:
/**
* 用于判斷是否是空字符串
* 方法名:isEmpty
* 創(chuàng)建人:剽悍一小兔
* 時間:2016年9月21日-下午6:56:33
* @param str
* @return boolean
*/
public static boolean isEmpty(String str) {
return null == str || str.equals("")
|| str.matches("\\s*");
}
這是一個字符串判空的函數(shù)镐牺,函數(shù)名為isEmpty,雖然看名字大概也能猜到它的作用又兵,可是任柜,一旦加上了注釋卒废,瞬間就變得更加清晰了沛厨,不是嗎?
這種注釋摔认,當(dāng)代碼被執(zhí)行的時候逆皮,執(zhí)行機制會自動忽略掉他們,因為這些文字其實是給程序員看的参袱,而不是給執(zhí)行機制看的电谣。
寫注釋是一種美德秽梅。
那么,注解又是什么呢剿牺?
我個人對它的看法是:所謂的注解企垦,就是寫給電腦看的高級注釋。
你可能經(jīng)常會看到代碼里面出現(xiàn)@XXX的標(biāo)志晒来,乍一看感覺挺高深的钞诡。反正我當(dāng)年就是這種感覺,頭腦里第一個反應(yīng)就是這肯定很難湃崩!
我還是那句話荧降,如果你總想著復(fù)雜,那么就永遠(yuǎn)看不到簡單攒读。
我們寫注釋朵诫,是給人看的,而注解就是寫給電腦看的薄扁。就這么簡單剪返。
這么說可能有點抽象,沒關(guān)系邓梅,我們來一個快速入門吧随夸。
2.提出問題
新建一個Java項目
項目名稱就叫做Annotation吧
在src旁邊右鍵,新建一個util包震放,也就是工具包宾毒。
弄一個專門處理日期的工具類
隨便寫一個日期格式化的方法。
package util;
import java.util.Date;
import java.text.SimpleDateFormat;
public class DateUtil {
public static String formatDate( Date date , String formatPattern ){
return new SimpleDateFormat(formatPattern).format(date);
}
}
注意殿遂,導(dǎo)包的時候要是java.util.Date;诈铛,而不是java.sql.Date;
測試:
Date now = new Date();//獲取當(dāng)前日期
System.out.println(now);
System.out.println(formatDate(now,"yyyy-MM-dd hh:mm:ss"));
控制臺打印:
Wed Sep 21 19:24:57 CST 2016
2016-09-21 07:24:57
這說明墨礁,我們寫的方法應(yīng)該是正確的幢竹。
很好,那么接下來要解決一個什么問題呢恩静?就是說焕毫,如果我想通過代碼來獲取關(guān)于這個方法的信息,那么該如何做呢驶乾?
寫注釋肯定是不行的邑飒,因為注釋是寫個程序員看的,電腦看不懂级乐,更別提獲取注釋的內(nèi)容了疙咸,是吧?
于是风科,注解撒轮,這一種高級的注釋就出現(xiàn)了乞旦。
3.編寫注解
關(guān)于注解,要明確三個問題:
- 要給誰加注解疤馍健兰粉?
- 什么時候注解起作用啊顶瞳?
- 要注解那些東西呢亲桦?
因為是快速入門莽鸿,所以大概知道這些就足夠了窿祥。
現(xiàn)在蜂奸,我們來新建一個注解鸠窗,毫無疑問愚墓,所謂的注解冲甘,它還是一個Java類碗硬,你不要被它嚇到吝秕。
新建一個注解包洲劣。
new一個Annotation备蚓,就叫MethodNote,意思就是說囱稽,這個是加在方法上的郊尝,為了給方法加一些電腦能看得懂的說明。
第一個問題是要給誰加注解罢骄流昏?那么,這個注解類是需要加在方法上的吞获,于是就這樣寫:
這就表示况凉,該注解要加在方法上。
接下來各拷,讓我們來明確第二個問題:什么時候注解起作用暗笕蕖?
我們希望在程序運行的時候烤黍,注解發(fā)揮作用知市,就是說,當(dāng)你的程序跑起來了速蕊,電腦才開始閱讀這些注解嫂丙。
這句話的意思就是說,我這個注解啊互例,是在程序跑起來的時候奢入,RUNTIME嘛,就是跑起來的時候媳叨,才發(fā)揮作用的腥光。
非常好,那么最后一個問題:要注解那些東西呢糊秆?
一個方法武福,最重要的信息包括:作用,創(chuàng)建時間痘番,作者捉片,版本,返回值等等汞舱。我們隨便抽取幾個伍纫,就作用和創(chuàng)建時間吧!
這種寫法有點類似于寫接口的方法昂芜。
好了莹规,我們的第一個注解就編寫完成了!寫好了就馬上用唄泌神,現(xiàn)在我們給日期格式化的方法加上咱自己編寫的注解良漱。
@MethodNote(createTime = "2016-9-21")
public static String formatDate(Date date , String formatPattern){
return new SimpleDateFormat(formatPattern).format(date);
}
這就是所謂的注解,其實也很簡單的吧欢际。就是這么來的母市,它歸根到底還是一個Java類。
4.通過Java反射獲取方法的注解信息
好了损趋,回到正題患久,我們已經(jīng)對formatDate方法進(jìn)行了注解,那么浑槽,既然這個注解是寫給電腦看的墙杯,那么電腦就肯定有辦法在其他Java類中獲得這些信息,對吧括荡?
如何獲得呢高镐,對了,用反射機制畸冲。
上代碼:
public static void main(String[] args) throws NoSuchMethodException, SecurityException {
Class classOfDateUtil = DateUtil.class;
Method formatDate = classOfDateUtil.getMethod("formatDate", Date.class,String.class);
MethodNote methodNote = formatDate.getAnnotation(MethodNote.class);
System.out.println("方法描述:" + methodNote.description());
System.out.println("創(chuàng)建日期:" + methodNote.createTime());
}
結(jié)果:
方法描述:作者很懶嫉髓,沒有寫本方法的作用。
創(chuàng)建日期:2016-9-21
本章結(jié)束 ...
本章對Java自定義注解做了一個快速入門邑闲,希望對你有所幫助算行。
免責(zé)聲明: 博客中所有的圖片素材均來自百度搜索,僅供學(xué)習(xí)交流苫耸,如有問題請聯(lián)系我州邢,侵立刪,謝謝褪子。