注解在JavaSE中算是比較高級(jí)的一種用法了,為什么要學(xué)習(xí)注解,我想大概有以下幾個(gè)原因:
1. 可以更深層次地學(xué)習(xí)Java,理解Java的思想.
2. 有了注解的基礎(chǔ),能夠方便閱讀各種框架的源碼,比如hibernate,SpringMVC等等。里面就用到了大量的注解。即便無(wú)法閱讀源碼,以后使用這些框架,會(huì)有一種心理上的安全感。
3. 方便今后跟別人吹牛。(當(dāng)然,這也很重要。)
好了,話不多說(shuō),我們開(kāi)始吧。
1. 從注釋的角度來(lái)理解注解
我想了很久,最終決定以這個(gè)小標(biāo)題作為第一節(jié)的標(biāo)題,我們?cè)诰帉?xiě)Java代碼的時(shí)候,為了讓我們的代碼看起來(lái)通俗易懂,就會(huì)加上注釋信息。
比如,我們寫(xiě)一個(gè)方法,會(huì)標(biāo)注上這個(gè)方法的作者,作用,版本等信息。是的,作為一個(gè)程序員,編寫(xiě)優(yōu)雅的注釋是一個(gè)非常重要的好習(xí)慣。
例:
/**
* 用于判斷是否是空字符串
* 方法名:isEmpty
* 創(chuàng)建人:剽悍一小兔
* 時(shí)間:2016年9月21日-下午6:56:33
* @param str
* @return boolean
*/
public static boolean isEmpty(String str) {
return null == str || str.equals("")
|| str.matches("\\s*");
}
這是一個(gè)字符串判空的函數(shù),函數(shù)名為isEmpty,雖然看名字大概也能猜到它的作用,可是,一旦加上了注釋?zhuān)查g就變得更加清晰了,不是嗎?
這種注釋?zhuān)?dāng)代碼被執(zhí)行的時(shí)候,執(zhí)行機(jī)制會(huì)自動(dòng)忽略掉他們,因?yàn)檫@些文字其實(shí)是給程序員看的,而不是給執(zhí)行機(jī)制看的。
寫(xiě)注釋是一種美德。
那么,注解又是什么呢?
我個(gè)人對(duì)它的看法是:所謂的注解,就是寫(xiě)給電腦看的高級(jí)注釋。
你可能經(jīng)常會(huì)看到代碼里面出現(xiàn)@XXX的標(biāo)志,乍一看感覺(jué)挺高深的。反正我當(dāng)年就是這種感覺(jué),頭腦里第一個(gè)反應(yīng)就是這肯定很難!
我還是那句話,如果你總想著復(fù)雜,那么就永遠(yuǎn)看不到簡(jiǎn)單。
我們寫(xiě)注釋?zhuān)墙o人看的,而注解就是寫(xiě)給電腦看的。就這么簡(jiǎn)單。
這么說(shuō)可能有點(diǎn)抽象,沒(méi)關(guān)系,我們來(lái)一個(gè)快速入門(mén)吧。
2.提出問(wèn)題
新建一個(gè)Java項(xiàng)目
項(xiàng)目名稱(chēng)就叫做Annotation吧
在src旁邊右鍵,新建一個(gè)util包,也就是工具包。
弄一個(gè)專(zhuān)門(mén)處理日期的工具類(lèi)
隨便寫(xiě)一個(gè)日期格式化的方法。
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)包的時(shí)候要是java.util.Date;,而不是java.sql.Date;
測(cè)試:
Date now = new Date();//獲取當(dāng)前日期
System.out.println(now);
System.out.println(formatDate(now,"yyyy-MM-dd hh:mm:ss"));
控制臺(tái)打印:
Wed Sep 21 19:24:57 CST 2016
2016-09-21 07:24:57
這說(shuō)明,我們寫(xiě)的方法應(yīng)該是正確的。
很好,那么接下來(lái)要解決一個(gè)什么問(wèn)題呢?就是說(shuō),如果我想通過(guò)代碼來(lái)獲取關(guān)于這個(gè)方法的信息,那么該如何做呢?
寫(xiě)注釋肯定是不行的,因?yàn)樽⑨屖菍?xiě)個(gè)程序員看的,電腦看不懂,更別提獲取注釋的內(nèi)容了,是吧?
于是,注解,這一種高級(jí)的注釋就出現(xiàn)了。
3.編寫(xiě)注解
關(guān)于注解,要明確三個(gè)問(wèn)題:
- 要給誰(shuí)加注解啊?
- 什么時(shí)候注解起作用啊?
- 要注解那些東西呢?
因?yàn)槭强焖偃腴T(mén),所以大概知道這些就足夠了。
現(xiàn)在,我們來(lái)新建一個(gè)注解,毫無(wú)疑問(wèn),所謂的注解,它還是一個(gè)Java類(lèi),你不要被它嚇到。
新建一個(gè)注解包。
new一個(gè)Annotation,就叫MethodNote,意思就是說(shuō),這個(gè)是加在方法上的,為了給方法加一些電腦能看得懂的說(shuō)明。
第一個(gè)問(wèn)題是要給誰(shuí)加注解啊?那么,這個(gè)注解類(lèi)是需要加在方法上的,于是就這樣寫(xiě):
這就表示,該注解要加在方法上。
接下來(lái),讓我們來(lái)明確第二個(gè)問(wèn)題:什么時(shí)候注解起作用啊?
我們希望在程序運(yùn)行的時(shí)候,注解發(fā)揮作用,就是說(shuō),當(dāng)你的程序跑起來(lái)了,電腦才開(kāi)始閱讀這些注解。
這句話的意思就是說(shuō),我這個(gè)注解啊,是在程序跑起來(lái)的時(shí)候,RUNTIME嘛,就是跑起來(lái)的時(shí)候,才發(fā)揮作用的。
非常好,那么最后一個(gè)問(wèn)題:要注解那些東西呢?
一個(gè)方法,最重要的信息包括:作用,創(chuàng)建時(shí)間,作者,版本,返回值等等。我們隨便抽取幾個(gè),就作用和創(chuàng)建時(shí)間吧!
這種寫(xiě)法有點(diǎn)類(lèi)似于寫(xiě)接口的方法。
好了,我們的第一個(gè)注解就編寫(xiě)完成了!寫(xiě)好了就馬上用唄,現(xiàn)在我們給日期格式化的方法加上咱自己編寫(xiě)的注解。
@MethodNote(createTime = "2016-9-21")
public static String formatDate(Date date , String formatPattern){
return new SimpleDateFormat(formatPattern).format(date);
}
這就是所謂的注解,其實(shí)也很簡(jiǎn)單的吧。就是這么來(lái)的,它歸根到底還是一個(gè)Java類(lèi)。
4.通過(guò)Java反射獲取方法的注解信息
好了,回到正題,我們已經(jīng)對(duì)formatDate方法進(jìn)行了注解,那么,既然這個(gè)注解是寫(xiě)給電腦看的,那么電腦就肯定有辦法在其他Java類(lèi)中獲得這些信息,對(duì)吧?
如何獲得呢,對(duì)了,用反射機(jī)制。
上代碼:
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é)果:
方法描述:作者很懶,沒(méi)有寫(xiě)本方法的作用。
創(chuàng)建日期:2016-9-21
本章結(jié)束 ...
本章對(duì)Java自定義注解做了一個(gè)快速入門(mén),希望對(duì)你有所幫助。
免責(zé)聲明: 博客中所有的圖片素材均來(lái)自百度搜索,僅供學(xué)習(xí)交流,如有問(wèn)題請(qǐng)聯(lián)系我,侵立刪,謝謝。