java:自定義注解以及注解解析

注解主要是用來減少代碼的冗余,用較少的代碼就可以實現(xiàn)更多的功能.

java提供了四類元注解,我們構(gòu)建新的注解都是用元注解來實現(xiàn)的,下邊就類注解Type,全局變量注解Filed,方法注解Method分別實現(xiàn),以及對這幾個注解進(jìn)行解析.
注解就運行周期分為三種:Source,Class,Runtime,當(dāng)前的例子都是針對Runtime來實現(xiàn)的.

類注解
@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
public @interface TypeAnno {
    String table() default "table";

}
方法注解
@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
@interface MethodAnno {
    FiledAnnoName setAnnoName() default @FiledAnnoName;

    FiledAnnoAge setAnnoAge() default @FiledAnnoAge;

    String method() default "method";
}
filed注解
@Target(ElementType.FIELD)//全局變量
@Retention(RetentionPolicy.RUNTIME)//運行時注解
@interface FiledAnnoAge {
    int age() default 0;//注解 構(gòu)造方法無參 必須有默認(rèn)值
}

@Target(ElementType.FIELD)
@Retention(RetentionPolicy.RUNTIME)
@interface FiledAnnoName {
    String value() default "";
}
使用注解的bean
@TypeAnno
public class AnnoBean {
    @FiledAnnoName("嘿嘿")
    String name = "Lucy";
    @FiledAnnoAge(age = 12)
    int age = 20;

    //value可不需要寫成key=value的樣式,直接寫value,但是必須是value的屬性.
    @MethodAnno(setAnnoName = @FiledAnnoName("方法"), setAnnoAge = @FiledAnnoAge(age = 18))
    public void testAnno() {

    }
}
注解解析器
public class AnnoCreator {

    /**
     * 解析局部變量的注解
     *
     * @throws Exception
     */
    public static void annoFiled() throws Exception {
        Class<AnnoBean> clazz = AnnoBean.class;
        //創(chuàng)建實例
        AnnoBean annoBean = clazz.newInstance();
        //得到類中的所有定義的屬性
        for (Field filed : clazz.getDeclaredFields()) {
            //得到屬性的注解潜沦,對一個目標(biāo)可以使用多個注解
            Annotation[] anns = filed.getAnnotations();//得到所有注解
            if (anns.length < 1) {
                continue;
            }
            //MyAge注解分析
            if (anns[0] instanceof FiledAnnoAge) {
                FiledAnnoAge filedAnnoAge = (FiledAnnoAge) anns[0];//注解的值
                String name = filed.getName();
                Log.e("filedName_AGE", name);
                int age = filed.getInt(annoBean);//實際的值
                Log.e("AGE", age + filedAnnoAge.age() + "");//實際的值+注解的值
            }
            //MyName注解分析
            if (anns[0] instanceof FiledAnnoName) {
                FiledAnnoName filedAnnoName = (FiledAnnoName) anns[0];
                String name = filedAnnoName.value();
                String fileName = (String) filed.get(annoBean);
                String filedName = filed.getName();
                Log.e("filedName_NAME", filedName);
                Log.e("Name", name + fileName + "");

            }
        }
    }


    /**
     * 解析類的注解
     *
     * @throws Exception
     */
    public static void annoType() throws Exception {
        Class<AnnoBean> clazz = AnnoBean.class;
        TypeAnno typeAnno = clazz.getAnnotation(TypeAnno.class);//得到單個注解
        Log.e("TableAnno", typeAnno.table());
    }

    /**
     * 解析方法的注解
     *
     * @throws Exception
     */
    public static void annoMethod() throws Exception {
        Class<AnnoBean> clazz = AnnoBean.class;
        //根據(jù)反射得到方法
        Method[] methods = clazz.getMethods();
        for (Method method:methods) {
            if (method.getName().equals("testAnno")){
                MethodAnno annotation = method.getAnnotation(MethodAnno.class);
                FiledAnnoAge filedAnnoAge = annotation.setAnnoAge();
                int age = filedAnnoAge.age();
                FiledAnnoName filedAnnoName = annotation.setAnnoName();
                String name = filedAnnoName.value();
                Log.e("Method_ANno", age + name + annotation.method());
            }

        }
    }
}

注解的調(diào)用測試

try {
                    AnnoCreator.annoFiled();
                    AnnoCreator.annoType();
                    AnnoCreator.annoMethod();
                } catch (Exception e) {
                    Log.e("ERROR",e.toString());
                }
測試結(jié)果
image.png
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子澳盐,更是在濱河造成了極大的恐慌,老刑警劉巖坑匠,帶你破解...
    沈念sama閱讀 222,946評論 6 518
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件后室,死亡現(xiàn)場離奇詭異,居然都是意外死亡惊来,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 95,336評論 3 399
  • 文/潘曉璐 我一進(jìn)店門棺滞,熙熙樓的掌柜王于貴愁眉苦臉地迎上來裁蚁,“玉大人,你說我怎么就攤上這事继准⊥髦ぃ” “怎么了?”我有些...
    開封第一講書人閱讀 169,716評論 0 364
  • 文/不壞的土叔 我叫張陵移必,是天一觀的道長室谚。 經(jīng)常有香客問我,道長崔泵,這世上最難降的妖魔是什么秒赤? 我笑而不...
    開封第一講書人閱讀 60,222評論 1 300
  • 正文 為了忘掉前任,我火速辦了婚禮憎瘸,結(jié)果婚禮上入篮,老公的妹妹穿的比我還像新娘。我一直安慰自己含思,他們只是感情好崎弃,可當(dāng)我...
    茶點故事閱讀 69,223評論 6 398
  • 文/花漫 我一把揭開白布甘晤。 她就那樣靜靜地躺著,像睡著了一般饲做。 火紅的嫁衣襯著肌膚如雪线婚。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 52,807評論 1 314
  • 那天盆均,我揣著相機與錄音塞弊,去河邊找鬼。 笑死泪姨,一個胖子當(dāng)著我的面吹牛游沿,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播肮砾,決...
    沈念sama閱讀 41,235評論 3 424
  • 文/蒼蘭香墨 我猛地睜開眼诀黍,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了仗处?” 一聲冷哼從身側(cè)響起眯勾,我...
    開封第一講書人閱讀 40,189評論 0 277
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎婆誓,沒想到半個月后吃环,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 46,712評論 1 320
  • 正文 獨居荒郊野嶺守林人離奇死亡洋幻,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 38,775評論 3 343
  • 正文 我和宋清朗相戀三年郁轻,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片文留。...
    茶點故事閱讀 40,926評論 1 353
  • 序言:一個原本活蹦亂跳的男人離奇死亡好唯,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出厂庇,到底是詐尸還是另有隱情渠啊,我是刑警寧澤输吏,帶...
    沈念sama閱讀 36,580評論 5 351
  • 正文 年R本政府宣布权旷,位于F島的核電站,受9級特大地震影響贯溅,放射性物質(zhì)發(fā)生泄漏拄氯。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 42,259評論 3 336
  • 文/蒙蒙 一它浅、第九天 我趴在偏房一處隱蔽的房頂上張望译柏。 院中可真熱鬧,春花似錦姐霍、人聲如沸鄙麦。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,750評論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽胯府。三九已至介衔,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間骂因,已是汗流浹背炎咖。 一陣腳步聲響...
    開封第一講書人閱讀 33,867評論 1 274
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留寒波,地道東北人乘盼。 一個月前我還...
    沈念sama閱讀 49,368評論 3 379
  • 正文 我出身青樓,卻偏偏與公主長得像俄烁,于是被迫代替她去往敵國和親绸栅。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 45,930評論 2 361

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