Java 注解學(xué)習(xí)

  • 注解是什么

我們?cè)谄綍r(shí)的工作中,可能會(huì)看到形如一下的代碼:

@Entity(tableName = "user")
public class User{
  
    @Id
    @Column(name="id")
    private long id;
  
    @Column(name="uid")
    private String uid;

    ...
}

這種標(biāo)記在類(lèi)上,方法上,@開(kāi)頭的就叫做注解.

  • 注解的用處

上圖是我們公司ORM框架的一個(gè)entity類(lèi),總所周知,ORM框架與數(shù)據(jù)庫(kù)打交道,最后也要轉(zhuǎn)為SQL語(yǔ)句.比如保存一條記錄,數(shù)據(jù)庫(kù)只接受INSERT INTO USER('id','uid') VALUES('1', 'huangzp')這樣的保存方式,如果當(dāng)我們操作 orm.save(user),這樣的代碼的時(shí)候,實(shí)際上也是將它轉(zhuǎn)成SQL,那么對(duì)象要怎么轉(zhuǎn)成SQL呢?可以看到,要轉(zhuǎn)成SQL,至少要知道表名,字段,那么我們?cè)陬?lèi)中標(biāo)明類(lèi)名和表名及成員變量和字段的對(duì)應(yīng)關(guān)系不就OK了嗎?當(dāng)我們要保存保存數(shù)據(jù)的時(shí)候,通過(guò)反射取得這些注解,然后拼成SQL.完美! 所以注解相當(dāng)于一個(gè)標(biāo)記,我們最后還是得通過(guò)反射等手段獲取這些注解,然后寫(xiě)成我們需要的功能.

  • 定義一個(gè)注解

我們使用一個(gè)類(lèi)的時(shí)候,我們要先去定義一個(gè)類(lèi),比如
public class Cat{}
同樣的,我們要使用一個(gè)注解,同樣也要去定義

@Target({ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
public @interface Entity {
    //注解元素
    String tableName() default "";
    //快捷方式,我們?cè)O(shè)置了value的元素的時(shí)候,設(shè)置value的值的時(shí)候,只需要@Entity("haha")而不需要@Entity(value="haha")
    String value() default "";
}
  1. @interface 是聲明一個(gè)注解,就像我們class,enum一樣.
  2. @Target 是注解修飾范圍的范圍,我們可以看一下ElementType這個(gè)枚舉類(lèi)
public enum ElementType {
    /**注解在類(lèi)名,接口名,枚舉名上 */
    TYPE,

    /** 注解在成員變量上 */
    FIELD,

    /** 注解在方法名上 */
    METHOD,

    /** 注解在方法參數(shù)上 */
    PARAMETER,

    /** 注解在構(gòu)造方法上 */
    CONSTRUCTOR,

    /** 注解在局部變量 */
    LOCAL_VARIABLE,

    /** 注解在注解上 */
    ANNOTATION_TYPE,

    /** 注解在包名上 */
    PACKAGE,

    /**
     * Type parameter declaration
     *
     * @since 1.8
     */
    TYPE_PARAMETER,

    /**
     * Use of a type
     *
     * @since 1.8
     */
    TYPE_USE
}
  1. @Retention 注解的運(yùn)行時(shí)期
    A. SOURCE : 注解將被編譯器丟棄(該類(lèi)型的注解信息只會(huì)保留在源碼里日川,源碼經(jīng)過(guò)編譯后,注解信息會(huì)被丟棄,不會(huì)保留在編譯好的class文件里)
    B. CLASS : 注解在class文件中可用,但會(huì)被VM丟棄(該類(lèi)型的注解信息會(huì)保留在源碼里和class文件里,在執(zhí)行的時(shí)候边败,不會(huì)加載到虛擬機(jī)中),請(qǐng)注意,當(dāng)注解未定義Retention值時(shí)噩峦,默認(rèn)值是CLASS,如Java內(nèi)置注解抽兆,@Override识补、@Deprecated、@SuppressWarnning等
    C. RUNTIME : 注解信息將在運(yùn)行期(JVM)也保留郊丛,因此可以通過(guò)反射信機(jī)制讀取注解的息(源碼李请、class文件和執(zhí)行的時(shí)候都有注解的信息)瞧筛,如SpringMvc中的@Controller、@Autowired导盅、@RequestMapping等较幌。
  2. 注解的元素及其類(lèi)型
    String name() default "";
    在注解名花括號(hào)里的便是注解的元素,它對(duì)應(yīng)的是我們寫(xiě)在@Entity(name="user"),的大括號(hào)里面的東西,除了常見(jiàn)的string和int類(lèi)型,它還可以是以下的幾種類(lèi)型:
@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
@interface Reference{
    boolean next() default false;
}

public @interface AnnotationElementDemo {
    //枚舉類(lèi)型
    enum Status {FIXED,NORMAL};

    //聲明枚舉
    Status status() default Status.FIXED;

    //布爾類(lèi)型
    boolean showSupport() default false;

    //String類(lèi)型
    String name()default "";

    //class類(lèi)型
    Class<?> testCase() default Void.class;

    //注解嵌套
    Reference reference() default @Reference(next=true);

    //數(shù)組類(lèi)型
    long[] value();
}
  • 元注解(@Target(ElementType.ANNOTATION_TYPE))

剛剛介紹的@Target,@Retention便是元注解,元注解負(fù)責(zé)注解其他注解,Java還有@Documented 和 @Inherited 兩個(gè)元注解.

  1. @Documented 被修飾的注解會(huì)生成到j(luò)avadoc中
  2. @Inherited 被注解的注解 注解的類(lèi),可以被其他類(lèi)繼承,然后注解的特性會(huì)轉(zhuǎn)移到子類(lèi)上,子類(lèi)Class對(duì)象使用getAnnotations()獲取父類(lèi)被@Inherited修飾的注解
  • Java內(nèi)置注解(@Retention(RetentionPolicy.RUNTIME))

  1. @Override:用于標(biāo)明此方法覆蓋了父類(lèi)的方法
  2. @Deprecated:用于標(biāo)明已經(jīng)過(guò)時(shí)的方法或類(lèi)
  3. @SuppressWarnnings:用于有選擇的關(guān)閉編譯器對(duì)類(lèi)、方法白翻、成員變量乍炉、變量初始化的警告 比如 :
    @SuppressWarnings({"uncheck","deprecation"})
  • 注解與反射

  1. public boolean isAnnotationPresent(Class<? extends Annotation> annotationClass) {}
    注解通過(guò)反射獲取。首先可以通過(guò) 對(duì)象的getClass()的 isAnnotationPresent() 方法判斷它是否應(yīng)用了某個(gè)注解
        User user = new User(); //開(kāi)文那個(gè)類(lèi)
        System.out.println(user.getClass().isAnnotationPresent(Entity.class));//運(yùn)行結(jié)果: true
  1. public <A extends Annotation> A getAnnotation(Class<A> annotationClass) {}
    然后通過(guò) getAnnotation() 方法來(lái)獲取 Annotation 對(duì)象滤馍。
        User user = new User();
        System.out.println(user.getClass().getAnnotation(Entity.class).tableName());//運(yùn)行結(jié)果為user
  1. public Annotation[] getAnnotations() {}
    或者是 getAnnotations() 方法獲取所有的Annotation對(duì)象,包括繼承的

  2. public Annotation[] getDeclaredAnnotations()
    獲取所有注解對(duì)象,不包括繼承的

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末岛琼,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子巢株,更是在濱河造成了極大的恐慌槐瑞,老刑警劉巖,帶你破解...
    沈念sama閱讀 206,311評(píng)論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件阁苞,死亡現(xiàn)場(chǎng)離奇詭異困檩,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)那槽,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,339評(píng)論 2 382
  • 文/潘曉璐 我一進(jìn)店門(mén)悼沿,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人骚灸,你說(shuō)我怎么就攤上這事糟趾。” “怎么了甚牲?”我有些...
    開(kāi)封第一講書(shū)人閱讀 152,671評(píng)論 0 342
  • 文/不壞的土叔 我叫張陵义郑,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我鳖藕,道長(zhǎng)魔慷,這世上最難降的妖魔是什么? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 55,252評(píng)論 1 279
  • 正文 為了忘掉前任著恩,我火速辦了婚禮院尔,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘喉誊。我一直安慰自己邀摆,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,253評(píng)論 5 371
  • 文/花漫 我一把揭開(kāi)白布伍茄。 她就那樣靜靜地躺著栋盹,像睡著了一般。 火紅的嫁衣襯著肌膚如雪敷矫。 梳的紋絲不亂的頭發(fā)上例获,一...
    開(kāi)封第一講書(shū)人閱讀 49,031評(píng)論 1 285
  • 那天汉额,我揣著相機(jī)與錄音,去河邊找鬼榨汤。 笑死蠕搜,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的收壕。 我是一名探鬼主播妓灌,決...
    沈念sama閱讀 38,340評(píng)論 3 399
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼蜜宪!你這毒婦竟也來(lái)了虫埂?” 一聲冷哼從身側(cè)響起,我...
    開(kāi)封第一講書(shū)人閱讀 36,973評(píng)論 0 259
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤圃验,失蹤者是張志新(化名)和其女友劉穎掉伏,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體损谦,經(jīng)...
    沈念sama閱讀 43,466評(píng)論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡岖免,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 35,937評(píng)論 2 323
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了照捡。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 38,039評(píng)論 1 333
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡话侧,死狀恐怖栗精,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情瞻鹏,我是刑警寧澤悲立,帶...
    沈念sama閱讀 33,701評(píng)論 4 323
  • 正文 年R本政府宣布,位于F島的核電站新博,受9級(jí)特大地震影響薪夕,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜赫悄,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,254評(píng)論 3 307
  • 文/蒙蒙 一原献、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧埂淮,春花似錦姑隅、人聲如沸。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 30,259評(píng)論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至痪蝇,卻和暖如春鄙陡,著一層夾襖步出監(jiān)牢的瞬間冕房,已是汗流浹背。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 31,485評(píng)論 1 262
  • 我被黑心中介騙來(lái)泰國(guó)打工趁矾, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留耙册,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 45,497評(píng)論 2 354
  • 正文 我出身青樓愈魏,卻偏偏與公主長(zhǎng)得像觅玻,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子培漏,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,786評(píng)論 2 345

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