Java中的注解

注解(annotation)

最近項(xiàng)目中看到很多注解,一臉懵逼,注解什么東西,于是網(wǎng)上各種搜索折騰,網(wǎng)上找到的答案千篇一律,能講明白的真的很少,看的也是迷迷糊糊,大概知道注解是和反射要搭配起來使用,如果只是單純?nèi)タ醋⒔飧杏X很迷惑,自定義注解,然后可以放在類,接口,方法,屬性,枚舉中,可以填充注解中所需的參數(shù),到底有什么用?注解到底干了什么?老子還是云里霧里的,不知所云。

注解字面去理解就是對指定對象(類,方法,接口...)等等的一個(gè)說明。
注解的創(chuàng)建末班:

@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Inherited
public @interface Other {
    String value() default "";
     int age();
     String[] names();
     annotaiton();
    ......
}

@Target:用于指定注解的作用域,那些對象可以使用該注解,例如ElementType.TYPE,指明注解可以應(yīng)用到類,接口,枚舉。
ElementType.METHOD ,指明注解可以應(yīng)用到方法中。
ElementType.FIELD,指明注解可以應(yīng)用到屬性中。

/** Class, interface (including annotation type), or enum declaration */
    TYPE,

    /** Field declaration (includes enum constants) */
    FIELD,

    /** Method declaration */
    METHOD,

    /** Formal parameter declaration */
    PARAMETER,

    /** Constructor declaration */
    CONSTRUCTOR,

    /** Local variable declaration */
    LOCAL_VARIABLE,

    /** Annotation type declaration */
    ANNOTATION_TYPE,

    /** Package declaration */
    PACKAGE,

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

    /**
     * Use of a type
     *
     * @since 1.8
     */
    TYPE_USE

@Retention: 用于指定注解的聲明周期。
RetentionPolicy.SOURCE 指明注解編譯前生效。
RetentionPolicy.CLASS 指明注解可以編譯在class類中。
RetentionPolicy.RUNTIME 指明注解可以程序運(yùn)行時(shí)生效。

/**
     * Annotations are to be discarded by the compiler.
     */
    SOURCE,

    /**
     * Annotations are to be recorded in the class file by the compiler
     * but need not be retained by the VM at run time.  This is the default
     * behavior.
     */
    CLASS,

    /**
     * Annotations are to be recorded in the class file by the compiler and
     * retained by the VM at run time, so they may be read reflectively.
     *
     * @see java.lang.reflect.AnnotatedElement
     */
    RUNTIME

@Documented:指明該對象可以生存和API文檔。
@Inherited: 該注解表明子類是有繼承了父類的注解。比如一個(gè)注解被該元注解修飾,并且該注解的作用在父類上,那么子類有持有該注解。如果注解沒有被該元注解修飾,則子類不持有父類的注解。

看到這里是不是還是一臉的懵逼,這是弄啥嘞。

這是我在網(wǎng)上找的一個(gè)例子,通過模擬Mybatis自動(dòng)生成sql語句的例子,等看完這個(gè)例子獲取你大概知道注解到底干了個(gè)啥。

Go例子

按照作者的給的例子,完成了整個(gè)代碼,運(yùn)行OK,回過頭再看下例子,大概有點(diǎn)豁然開朗。

總結(jié)下:單純的注解是毫無意義的存在,必須配合反射技術(shù)的使用,才能凸顯其價(jià)值,注解類似于一個(gè)無形的軟橋,他會(huì)將被他注解的類中帶的信息傳遞到一個(gè)指定的類中,通過反射技術(shù)獲取到該類的信息,然后在做一些見不得人的的事情。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容