java 註解(Annotation)

註解至關於一種標記,在程序中加了註解就等於爲程序打上了某種標記,沒加,則等於沒有某種標記。java

    之後,javac編譯器,開發工具和其餘程序能夠用反射來了解你的類及各類元素上有無何種標記,看你有什麼標記,就去幹相應的事。數組

標記能夠加在包,類,字段,方法,方法的參數以及局部變量上。ide

一個註解至關於一個類。工具

 

看java.lang包,可看到JDK中提供的最基本的annotation。開發工具

@SuppressWarning(」deprecation」)--->壓制警告測試

 

SupressWarning是告知編譯器或開發工具等提示指定的編譯器警告;spa

 

「deprecation」是告知具體的信息即方法已過期。對象

 

 

@Deprecated(過期的方法,對於再也不使用的方法,可能別人或別的地方有調用這個方法,不能刪除完事)開發

直接在剛纔的類中增長一個方法,並加上@Deprecated標註,在另一個類中調用這個方法。測試一下。文檔

@SuppressWarnings("deprecation") (用這個能夠告訴 程序說,我知道調用的方法過期了)

@Override--->提示覆蓋(父類方法)

public boolean equals(Reflect other)方法與HashSet結合講解

   像person類,覆蓋父類的equals 和hashCode方法,人家接收的參數是Object,人們習慣老是傳入本身的對象,形成覆蓋失敗,變成重載!

 

註解的應用結構圖

 

 

 

 

演示和講解@Target元註解

 

Target(告訴編譯器,自定義的註解類能夠用在方法仍是類....),設置Target等於ElementType.METHOD,原來加在類上的註解就報錯了,改成用數組方式設置{ElementType.METHOD,ElementType.TYPE}就能夠了。

 

元註解以及其枚舉屬性值不用記,只要會看jdk提供那幾個基本註解的API幫助文檔的定義或其源代碼,按圖索驥便可查到,或者直接看java.lang.annotation包下面的類。

 

 

(自定義註解)示例代碼:     

@Retention(RetentionPolicy.RUNTIME)//告訴程序說,這個註解要保存到運行時期 

@Target({ElementType.METHOD,ElementType.TYPE})//告訴編譯器,這個註解能夠用在方法上,也能夠用在類上 

 

public @interface MyAnnotation { 

    String color() default "yellow";//默認缺省值爲yellow 

    String value() ;//不指定 

    int [] arrayAttr() default {1,2};//默認爲{1,2} 

    EnumTest.TrafficLamp lamp() default EnumTest.TrafficLamp.RED;//枚舉類 

    MetaAnnotation annotationAttr() default @MetaAnnotation("xxx");//屬性中加註解,用@。能夠在對別的類加註解時,改變值 

}

 

爲註解增長基本屬性

(能夠是八種基本數據類型,String ,數組,枚舉,註解,Class

 

什麼是註解的屬性?

一個註解至關於一個胸牌,若是你胸前貼了胸牌,就是傳智播客的學生,不然,就不是。若是還想區分出是傳智播客哪一個班的學生,這時候能夠爲胸牌在增長一個屬性來進行區分。加了屬性的標記效果爲:@MyAnnotation(color="red")

 

定義基本類型的屬性和應用屬性:

在註解類中增長String color();

@MyAnnotation(color="red")

用反射方式得到註解對應的實例對象後,再經過該對象調用屬性對應的方法

MyAnnotation a = (MyAnnotation)AnnotationTest.class.getAnnotation(MyAnnotation.class);

System.out.println(a.color());

 

能夠認爲上面這個@MyAnnotation是MyAnnotaion類的一個實例對象

若是註解中有一個名稱爲value的屬性,且你只想設置value屬性(即其餘屬性都採用默認值或者你只有一個value屬性),那麼能夠省略value=部分,例如:@MyAnnotation("lhm")。

枚舉和註解都是特殊的類,不能用new 建立它們的實例對象,建立枚舉的實例對象就是在其中增長元素。

在程序中如何建立出一個註解的實例對象啊?直接用@放上一個標記便可

 

Eg:package july78javaEnhance;

 

import java.lang.annotation.Retention;

import java.lang.annotation.RetentionPolicy;

 

@Retention(RetentionPolicy.RUNTIME)//元註解:信息的信息就是元信息 RUNTIME,保留到運行期間

/**

 * 指示註釋類型的註釋要保留多久。若是註釋類型聲明中不存在 Retention 註釋,

 * 則保留策略默認爲 RetentionPolicy.CLASS。

 */

//@Target(ElementType.METHOD)若是加上這句的話(只能做用於方法),那邊就會報錯!

public @interface AnnotationDemo12 {//註解

 

    String color() default "blue";//至關於構造方法同樣,若是給了它默認的初值,能夠不用再設置(有默認的)

    String value();

    int []age();//數組和枚舉類型的註解

    //還有註解類型的註解,暫時沒學會

    MetaAnnotation annotation();

    //上面的MetaAnnotation是本身定義的一個註解類型,這樣的話對於應用了當前註解的AnnotationDemo11類,就必須寫上註解類型的屬性

}

 

package july78javaEnhance;

 

import java.util.Arrays;

 

//備註:應用註解後,它的屬性你你沒有寫上,它會給予提醒!missing attribution

@AnnotationDemo12(color = "red",value = "j2ee",age = {1,2,3}, annotation = @MetaAnnotation(sex = "男"))//註解加註解

public class AnnotationDemo11 {

    @SuppressWarnings("deprecation")//壓縮註解,一個註解就是一個類,用到的一個註解就至關因而調用的實例對象

    @AnnotationDemo12(value = "jase",age = {1,2,3}, annotation = @MetaAnnotation(sex = "女"))//備註:若是別的屬性有默認值,只有一個屬性須要你設置,那麼你就不須要寫上所有的

    //賦值表達式,如上直接寫上"jase"就行

    public static void main(String[] args) {

       

        System.runFinalizersOnExit(true);//表示已通過時的方法,開發工具會給它中間加上一天橫線

        /**

         *  boolean isAnnotationPresent(Class<? extends Annotation> annotationClass)

            若是指定類型的註釋存在於此元素上,則返回 true,不然返回 false。

         */

        if(AnnotationDemo11.class.isAnnotationPresent(AnnotationDemo12.class)){

            AnnotationDemo12 annocation = (AnnotationDemo12)AnnotationDemo11.class

                    .getAnnotation(AnnotationDemo12.class);//證實這裏面有你的註解

           

            System.out.println(annocation.color());//調用屬性

            System.out.println(Arrays.toString(annocation.age()));//將數組打印出來

            System.out.println(annocation.annotation().sex());//至關於調用屬性的屬性

        }

    }

}

相關文章
相關標籤/搜索