淺談JAVA注解(Annotation)

一云矫、廢話

上一次寫的簡書,現(xiàn)在看汗菜,很尷尬(?.?)我很想刪掉让禀,但是畢竟第一次還是不刪了吧挑社。今天想學(xué)習(xí)一下Java中的注解,就當(dāng)記錄一下(順便學(xué)習(xí)使用一下Markdown)巡揍。

二痛阻、發(fā)現(xiàn)與認(rèn)識

public class IncomeFragment extends BaseFragment {    
@Bind(R.id.iv_user_img)    
ImageView mIvUserImg;    
@Bind(R.id.tv_income_user_name)   
TextView  mTvIncomeUserName;    
@Bind(R.id.tv_total_income)    
TextView  mTvTotalIncome;    
@Bind(R.id.tv_record)    
TextView  mTvRecord;    
@Bind(R.id.tv_bank_count)    
TextView  mTvBankCount;    
@Override    
protected View initView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {        
View rootView = inflater.inflate(R.layout.fragment_income, container, false);
  • 代碼上@Override(重寫方法的注解),其實(shí)這是JDK1.5以后引入的新特性
    JDK1.5之后內(nèi)部提供的三個(gè)注解
    @Deprecated 意思是“廢棄的腮敌,過時(shí)的
    @Override 意思是“重寫阱当、覆蓋
    @SuppressWarnings 意思是“壓縮警告
  • 用著Butterknife開發(fā)的安卓童鞋肯定知道一鍵初始化控件帶來方便
    看一下@Bind的源碼
/*****
 *****Bind a field to the view for the specified ID. The view will automatically be cast to the field
 *****type.
 *****{@literal @}Bind(R.id.title) TextView title;
 *****/
@Retention(CLASS) 
@Target(FIELD)
public @interface Bind {
  /** View ID to which the field will be bound. */
  int[] value();
}

從源碼上看注解類似于接口(其實(shí)就是一種特殊接口)

注解(Annotation)相當(dāng)于一種標(biāo)記糜工,javac編譯器、開發(fā)工具和其他程序可以通過反射機(jī)制來了解你的類及各種屬性和方法上有無某個(gè)標(biāo)記捌木,就去干相應(yīng)的事,標(biāo)記可以加在包刨裆、類澈圈,屬性、方法帆啃,方法的參數(shù)以及局部變量上瞬女。

三、了解與使用

認(rèn)識注解前先認(rèn)識元注解链瓦,元注解:在注解類上使用另一個(gè)注解類拆魏,那么被使用的注解類就稱為元注解

import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
/*****
 *****創(chuàng)建者:  LeeBoo
 *****創(chuàng)建時(shí)間:2016/12/29 10:44 
 *****描述:    自定義注解 Annotation 
 *****/
@Retention(RetentionPolicy.RUNTIME)
@Target({ElementType.METHOD, ElementType.TYPE})
public @interface Annotation {
}

上面代碼的Retention和Target稱為元注解

  • @Retention(RetentionPolicy.RUNTIME)
    Retention注解決定Annotation注解的生命周期
  • @Target({ElementType.METHOD, ElementType.TYPE})
    Target注解決定Annotation注解可以加在類身上,或者屬性身上慈俯,或者方法等成分身上

Retention元注解有3種value屬性值
@Retention(RetentionPolicy.SOURCE)
Annotation注解生命周期:只在java源文件中存在渤刃,javac編譯成.class文件后注解就不存在了
@Retention(RetentionPolicy.CLASS)
Annotation注解生命周期:在java源文件(.java文件)中存在,編譯成.class文件后注解也還存在贴膘,被Annotation注解類標(biāo)識的類被類加載器加載到內(nèi)存中后Annotation注解就不存在了
@Retention(RetentionPolicy.RUNTIME)
Annotation注解生命周期:讓Annotation這個(gè)注解的生命周期一直程序運(yùn)行時(shí)都存在

@Target元注解決定了一個(gè)注解可以標(biāo)識到哪里卖子,如標(biāo)識在類上,在屬性上刑峡,或者在方法上and so on洋闽, @Target默認(rèn)值為可標(biāo)識在任何地方

此時(shí)不是該看看@Deprecated、@Override突梦、@SuppressWarnings這三個(gè)注解的@Retention和@Target注解的屬性值分別是什么嗎诫舅??宫患?

3.1為注解增加屬性

@Retention(RetentionPolicy.RUNTIME)
@Target( { ElementType.METHOD, ElementType.TYPE })
public @interface Annotation {
    boolean isProgrammer ();//添加屬性
    **注解的屬性定義方式就和接口中定義方法的方式一樣**
}
3.1.1為注解增加屬性的默認(rèn)值
@Retention(RetentionPolicy.RUNTIME)
@Target( { ElementType.METHOD, ElementType.TYPE })
public @interface Annotation {
    boolean isProgrammer() default true;//添加屬性默認(rèn)值true
}
3.1.2注解中有一個(gè)名稱為value的屬性
@Retention(RetentionPolicy.RUNTIME)
@Target( { ElementType.METHOD, ElementType.TYPE })
public @interface Annotation {
    boolean isProgrammer() default true;//添加屬性默認(rèn)值true
    String value() default "Java Programmer"; //名稱為value的屬性 默認(rèn)值為"Java Programmer"
}

3.2使用注解屬性

//應(yīng)用Annotation注解的isProgrammer屬性為true
寫法1
@Annotation(isProgrammer = true)
寫法2
@Annotation
//應(yīng)用Annotation注解的value屬性為Java Programmer
寫法1
@Annotation(value = "Java Programmer")   
寫法2
@Annotation("Java Programmer")      **即value=可以省略**
public class AnnotationUse {
}

3.3注解高級屬性

3.3.1刊懈、數(shù)組類型的屬性

注解類添加數(shù)組類型的屬性:int[] id() default {1,2,3};
使用類使用數(shù)組類型的屬性:@Annotation(id={2,3,4})
如果數(shù)組屬性只有一個(gè)值,這時(shí)候?qū)傩灾挡糠挚梢允÷源罄ㄌ枺纾篅Annotation(id=2)虚汛,表示數(shù)組屬性只有一個(gè)值匾浪,值為2(如同Butterknife中onClick注解)

3.3.2、枚舉類型的屬性

注解類添加枚舉類型的屬性:Language language() default Language.OC;
使用類使用枚舉類型的屬性:@Annotation(language=Language.JAVA)

3.3.3卷哩、元注解類型的屬性
a蛋辈、元注解類型的屬性創(chuàng)建
public @interface GradeAnnotation {
    String grade()  default  "高級開發(fā)程序員";//元注解GradeAnnotation設(shè)置有一個(gè)屬性grade
}
b、元注解類型的屬性添加
  • Language 枚舉
public enum Language { 
   OC,       //object-C 
   JAVA      //java
 }
@Retention(RetentionPolicy.RUNTIME)
@Target({ElementType.METHOD, ElementType.TYPE})
public @interface Annotation {
    //添加一個(gè)int類型數(shù)組的屬性
    int[] id() default {1,2,4};
    //添加一個(gè)枚舉類型的屬性将谊,并指定枚舉屬性的缺省值冷溶,缺省值只能從枚舉類Language 中定義的枚舉對象中取出任意一個(gè)作為缺省值
    Language language() default Language.OC;
    //**為注解添加一個(gè)注解類型的屬性,并指定注解屬性的缺省值**
    GradeAnnotation gradeAnnotation () default @GradeAnnotation(grade = "初級開發(fā)程序員");
}
c、元注解類型的屬性使用
@Annotation( id = {8,0,8}, language = Language.JAVA, gradeAnnotation = @GradeAnnotation (grade = "中級開發(fā)程序員"))
public class AnnotationUse {
  @Annotation  //將Annotation注解標(biāo)注到main方法上
  public static void main(String[] args) {
   **使用反射機(jī)制對Annotation類的檢查**
   一旦在某個(gè)類上使用了@Annotation尊浓,那么這個(gè)Annotation類的實(shí)例對象annotation就會被創(chuàng)建出來了
            Annotation annotation = (Annotation) AnnotationTest.class.getAnnotation(Annotation.class);
            System.out.println(annotation.language());//JAVA
            System.out.println(annotation.id().length);//3       
            GradeAnnotation ga = annotation.gradeAnnotation();
            System.out.println(ga.grade());//輸出的結(jié)果為:"中級開發(fā)程序員"
   }
}
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末挂洛,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子眠砾,更是在濱河造成了極大的恐慌,老刑警劉巖托酸,帶你破解...
    沈念sama閱讀 221,888評論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件褒颈,死亡現(xiàn)場離奇詭異,居然都是意外死亡励堡,警方通過查閱死者的電腦和手機(jī)谷丸,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,677評論 3 399
  • 文/潘曉璐 我一進(jìn)店門应结,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人揩慕,你說我怎么就攤上這事迎卤$枳梗” “怎么了?”我有些...
    開封第一講書人閱讀 168,386評論 0 360
  • 文/不壞的土叔 我叫張陵樟凄,是天一觀的道長缝龄。 經(jīng)常有香客問我,道長服鹅,這世上最難降的妖魔是什么企软? 我笑而不...
    開封第一講書人閱讀 59,726評論 1 297
  • 正文 為了忘掉前任仗哨,我火速辦了婚禮铅辞,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘斟珊。我一直安慰自己,他們只是感情好旨椒,可當(dāng)我...
    茶點(diǎn)故事閱讀 68,729評論 6 397
  • 文/花漫 我一把揭開白布综慎。 她就那樣靜靜地躺著勤庐,像睡著了一般。 火紅的嫁衣襯著肌膚如雪米罚。 梳的紋絲不亂的頭發(fā)上岛杀,一...
    開封第一講書人閱讀 52,337評論 1 310
  • 那天,我揣著相機(jī)與錄音糊肠,去河邊找鬼遗锣。 笑死,一個(gè)胖子當(dāng)著我的面吹牛弧圆,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播霹期,決...
    沈念sama閱讀 40,902評論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼拯田,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了吭产?” 一聲冷哼從身側(cè)響起臣淤,我...
    開封第一講書人閱讀 39,807評論 0 276
  • 序言:老撾萬榮一對情侶失蹤窃爷,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后寺董,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體刻剥,經(jīng)...
    沈念sama閱讀 46,349評論 1 318
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡造虏,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,439評論 3 340
  • 正文 我和宋清朗相戀三年漓藕,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了享钞。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片诀蓉。...
    茶點(diǎn)故事閱讀 40,567評論 1 352
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖狐肢,靈堂內(nèi)的尸體忽然破棺而出沥曹,到底是詐尸還是另有隱情碟联,我是刑警寧澤鲤孵,帶...
    沈念sama閱讀 36,242評論 5 350
  • 正文 年R本政府宣布辰如,位于F島的核電站,受9級特大地震影響鹰椒,放射性物質(zhì)發(fā)生泄漏漆际。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,933評論 3 334
  • 文/蒙蒙 一奸汇、第九天 我趴在偏房一處隱蔽的房頂上張望擂找。 院中可真熱鬧浩销,春花似錦、人聲如沸慢洋。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,420評論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽太防。三九已至,卻和暖如春讳嘱,著一層夾襖步出監(jiān)牢的瞬間酿愧,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,531評論 1 272
  • 我被黑心中介騙來泰國打工叛氨, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人屁置。 一個(gè)月前我還...
    沈念sama閱讀 48,995評論 3 377
  • 正文 我出身青樓蓝角,卻偏偏與公主長得像饭冬,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個(gè)殘疾皇子昌抠,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,585評論 2 359

推薦閱讀更多精彩內(nèi)容