日本搞逼视频_黄色一级片免费在线观看_色99久久_性明星video另类hd_欧美77_综合在线视频

國內(nèi)最全IT社區(qū)平臺 聯(lián)系我們 | 收藏本站
阿里云優(yōu)惠2
您當前位置:首頁 > php開源 > php教程 > 注解(一)——注解入門

注解(一)——注解入門

來源:程序員人生   發(fā)布時間:2016-12-06 11:04:32 閱讀次數(shù):3154次

注解


Annotation(注解)概述

從JDK5.0開始, Java增加了對元數(shù)據(jù)(MetaData)的支持,也就是 Annotation(注解)。
Annotation其實就是代碼里的特殊標記,它用于替換配置文件,也就是說,傳統(tǒng)方式通過配置文件告知類如何運行,有了注解技術(shù)后,開發(fā)人員可以通過注解告知類如何運行。在Java技術(shù)里注解的典型利用是:可以通過反射技術(shù)去得到類里面的注解,以決定怎樣去運行類。
掌握注解技術(shù)的要點:

  • 如何定義注解。
  • 如何反射注解,并根據(jù)反射的注解信息,決定如何去運行類。

了解注解及java提供的幾個基本注解

  • @SuppressWarnings:抑制編譯器正告。
    首先編寫1個AnnotationTest類,先通過@SuppressWarnings的利用讓大家認識和了解1下注解,通過System.runFinalizersOnExit(true);的編譯正告引出@SuppressWarnings("deprecation")。

    public class AnnotationTest { @SuppressWarnings("deprecation") public static void main(String[] args) { System.runFinalizersOnExit(true); } }
  • @Deprecated:用于表示某個程序元素(類,方法等)已過時。
    接著直接在剛才的類中增加1個方法,并加上@Deprecated標注,在另外1個類中調(diào)用這個方法。

    public class AnnotationTest { @SuppressWarnings("deprecation") public static void main(String[] args) { System.runFinalizersOnExit(true); } @Deprecated public static void sayHello() { System.out.println("hi,李阿昀"); } }
  • @Override:限定重寫父類方法,該注解只能用于方法。
    表示1個方法聲明打算重寫超類中的另外一個方法聲明。如果方法利用此注釋類型進行注解但沒有重寫超類方法,則編譯器會生成1條毛病消息。
    public boolean equals(Reflect other)方法與HashSet結(jié)合講授。

總結(jié):注解相當于1種標記,在程序中加了注解就等于為程序打上了某種標記,沒加,則等于沒有某種標記,以后,javac編譯器,開發(fā)工具和其他程序可以用反射來了解你的類及各種元素上有沒有何種標記,看你有甚么標記,就去干相應的事。標記可以加在包,類,字段,方法,方法的參數(shù)和局部變量上

注解的利用結(jié)構(gòu)圖

注解就相當于1個你的源程序中要調(diào)用的1個類,要在源程序中利用某個注解,得先準備好了這個注解類,就像你要調(diào)用某個類,得先要開發(fā)好這個類。
這里寫圖片描述

自定義注解及其利用

定義新的Annotation類型使用@interface關(guān)鍵字。

  • 定義1個最簡單的注解:

    public @interface ItcastAnnotation { }
  • 把它加在某個類上:

    @ItcastAnnotation public class AnnotationTest { @SuppressWarnings("deprecation") public static void main(String[] args) { System.runFinalizersOnExit(true); } @Deprecated public static void sayHello() { System.out.println("hi,李阿昀"); } }
  • 用反射進行測試AnnotationTest的定義上是不是有@ItcastAnnotation:

    @ItcastAnnotation public class AnnotationTest { @SuppressWarnings("deprecation") public static void main(String[] args) { System.runFinalizersOnExit(true); if(AnnotationTest.class.isAnnotationPresent(ItcastAnnotation.class)) { // 類上是不是有注解,默許情況下返回false ItcastAnnotation annotation = (ItcastAnnotation)AnnotationTest.class.getAnnotation(ItcastAnnotation.class); System.out.println(annotation); } } @Deprecated public static void sayHello() { System.out.println("hi,李阿昀"); } }

    發(fā)現(xiàn)控制臺無任何反應,根據(jù)反射測試的問題,引出@Retention元注解的講授。

  • @Retention元注解
    只能用于修飾1個Annotation的定義, 用于指定該Annotation可以保存的域,@Rentention包括1個RetentionPolicy類型的成員變量,通過這個變量指定域。其有3種取值:

    • RetetionPolicy.SOURCE:編譯器直接拋棄這類策略的注解。
    • RetetionPolicy.CLASS:編譯器將把注解記錄在class文件中,當運行Java程序時,JVM不會保存注解。這是默許值。
    • RetetionPolicy.RUNTIME:編譯器將把注解記錄在class文件中。當運行Java程序時,JVM會保存注解,程序可以通過反射獲得該注解。

    分別對應:java源文件→class文件→內(nèi)存中的字節(jié)碼。也即1個Java類具有3種狀態(tài):

    編譯 JVM裝載進內(nèi)存 .java -------------------> .class -------------------> 運行時(內(nèi)存里面的java類)

    對@Retention元注解更加細致的解釋:

    • 當在java源程序上加入注解,此源程序接著要由javac去編譯,javac把源文件編譯成.class時,可能會把源程序上的1些注解給去掉,此時.class文件里面就沒有注解了,這是1種可能。
    • 假定javac編譯器把注解留在.class文件里面,結(jié)果我們的程序在使用.class時,要由類加載器把.class文件給調(diào)到內(nèi)存里來,只有把.class文件加載到內(nèi)存里來以后,類加載器加載完了以后,類加載器會對.class文件進行處理,安全檢查等,處理完了以后,在內(nèi)存中終究的2進制文件才是字節(jié)碼,類加載器在把.class文件調(diào)到內(nèi)存的進程中,也有轉(zhuǎn)換,轉(zhuǎn)換的時候是不是把.class文件里面的注解保存下來,這也是1種可能。

    所以,1個注解的生命周期有3個階段。
    我們定義的簡單注解修改成以下:

    @Retention(RetentionPolicy.RUNTIME) public @interface ItcastAnnotation { }

    就可以正確打印了。
    結(jié)論我們寫1個注解的目的,主要是用來替換配置文件,我們希望這個類在運行時取得注解配置的信息,來運行我這個類,想要注解配置的信息能夠讓類在運行時獲得到,那就1定要把這個注解聲明在運行時。
    思考:@Override、@SuppressWarnings和@Deprecated這3個注解的屬性值分別是甚么?
    答:

    @Override→RetetionPolicy.SOURCE
    @SuppressWarnings→RetetionPolicy.SOURCE
    @Deprecated→RetetionPolicy.RUNTIME

  • @Target元注解
    指定注解用于修飾類的哪一個成員。@Target包括了1個名為value,類型為ElementType的成員變量。如若聲明注解時,沒指定@Target,默許該注解可以作用在類的所有成員上。
    Target的默許值為任何元素,設置Target等于ElementType.METHOD,原來加在類上的注解就報錯了,改成用數(shù)組方式設置{ElementType.METHOD,ElementType.TYPE}就能夠了,表示此注解既可以在方法上使用,也可在類上使用。

  • @Documented元注解
    用于指定被該元Annotation修飾的Annotation類將被javadoc工具提取成文檔。
  • @Inherited元注解
    被它修飾的Annotation將具有繼承性。如果某個類使用了被@Inherited修飾的Annotation,則其子類將自動具有該注解。

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

為注解增加基本屬性

注解屬性的作用:原來寫在配置文件中的信息,可以通過注解的屬性進行描寫。

  • 甚么是注解的屬性
    1個注解相當于1個胸牌,如果你胸前貼了胸牌,就是傳智播客的學生,否則,就不是。如果還想辨別出是傳智播客哪一個班的學生,這時候候可以為胸牌在增加1個屬性來進行辨別。加了屬性的標記效果為:@ItcastAnnotation(color="red")
  • 定義基本類型的屬性和利用屬性
    在注解類中增加String color()

    @Retention(RetentionPolicy.RUNTIME) @Target({ElementType.METHOD,ElementType.TYPE}) public @interface ItcastAnnotation { String color(); }

    用反射方式取得注解對應的實例對象后,再通過該對象調(diào)用屬性對應的方法:

    @ItcastAnnotation(color="red") public class AnnotationTest { @SuppressWarnings("deprecation") public static void main(String[] args) { System.runFinalizersOnExit(true); if(AnnotationTest.class.isAnnotationPresent(ItcastAnnotation.class)) { // 類上是不是有注解,默許情況下返回false ItcastAnnotation annotation = (ItcastAnnotation)AnnotationTest.class.getAnnotation(ItcastAnnotation.class); System.out.println(annotation.color()); // red } } @Deprecated public static void sayHello() { System.out.println("hi,李阿昀"); } }

    可以認為上面這個@ItcastAnnotation(color=”red”)是ItcastAnnotation類的1個實例對象。

  • 為屬性指定缺省值:

    @Retention(RetentionPolicy.RUNTIME) @Target({ElementType.METHOD,ElementType.TYPE}) public @interface ItcastAnnotation { String color() default "blue"; }
  • value屬性

    @Retention(RetentionPolicy.RUNTIME) @Target({ElementType.METHOD,ElementType.TYPE}) public @interface ItcastAnnotation { String color() default "blue"; String value(); }

    用反射方式取得注解對應的實例對象后,再通過該對象調(diào)用屬性對應的方法:

    @ItcastAnnotation(color="red", value="abc") public class AnnotationTest { @SuppressWarnings("deprecation") @ItcastAnnotation("xyz") public static void main(String[] args) { System.runFinalizersOnExit(true); if(AnnotationTest.class.isAnnotationPresent(ItcastAnnotation.class)) { // 類上是不是有注解,默許情況下返回false ItcastAnnotation annotation = (ItcastAnnotation)AnnotationTest.class.getAnnotation(ItcastAnnotation.class); System.out.println(annotation.value()); // abc } } @Deprecated public static void sayHello() { System.out.println("hi,李阿昀"); } }

    注意:如果注解中有1個名稱為value的屬性,且你只想設置value屬性(即其他屬性都采取默許值或你只有1個value屬性),那末可以省略value=部份,例如:@ItcastAnnotation("lhm")。

為注解增加高級屬性

  • 數(shù)組類型的屬性

    @Retention(RetentionPolicy.RUNTIME) @Target({ElementType.METHOD,ElementType.TYPE}) public @interface ItcastAnnotation { String color() default "blue"; String value(); int[] arrayAttr() default {3,4,4}; }

    用反射方式取得注解對應的實例對象后,再通過該對象調(diào)用屬性對應的方法:

    @ItcastAnnotation(color="red", value="abc", arrayAttr=1) public class AnnotationTest { @SuppressWarnings("deprecation") @ItcastAnnotation("xyz") public static void main(String[] args) { System.runFinalizersOnExit(true); if(AnnotationTest.class.isAnnotationPresent(ItcastAnnotation.class)) { // 類上是不是有注解,默許情況下返回false ItcastAnnotation annotation = (ItcastAnnotation)AnnotationTest.class.getAnnotation(ItcastAnnotation.class); System.out.println(annotation.arrayAttr().length); // 1 } } @Deprecated public static void sayHello() { System.out.println("hi,李阿昀"); } }

    注意:如果數(shù)組屬性中只有1個元素,這時候候?qū)傩灾挡糠菘梢允÷源罄ㄌ枴?/p>

  • 枚舉類型的屬性

    @Retention(RetentionPolicy.RUNTIME) @Target({ElementType.METHOD,ElementType.TYPE}) public @interface ItcastAnnotation { String color() default "blue"; String value(); int[] arrayAttr() default {3,4,4}; EnumTest.TrafficLamp lamp() default EnumTest.TrafficLamp.RED; }

    用反射方式取得注解對應的實例對象后,再通過該對象調(diào)用屬性對應的方法:

    @ItcastAnnotation(color="red", value="abc", arrayAttr=1) public class AnnotationTest { @SuppressWarnings("deprecation") @ItcastAnnotation("xyz") public static void main(String[] args) { System.runFinalizersOnExit(true); if(AnnotationTest.class.isAnnotationPresent(ItcastAnnotation.class)) { // 類上是不是有注解,默許情況下返回false ItcastAnnotation annotation = (ItcastAnnotation)AnnotationTest.class.getAnnotation(ItcastAnnotation.class); System.out.println(annotation.lamp().nextLamp().name()); // GREEN } } @Deprecated public static void sayHello() { System.out.println("hi,李阿昀"); } }
  • 注解類型的屬性:
    我們再定義1個注解MetaAnnotation

    public @interface MetaAnnotation { String value(); }

    接著再定義1個注解類型的屬性:

    @Retention(RetentionPolicy.RUNTIME) @Target({ElementType.METHOD,ElementType.TYPE}) public @interface ItcastAnnotation { String color() default "blue"; String value(); int[] arrayAttr() default {3,4,4}; EnumTest.TrafficLamp lamp() default EnumTest.TrafficLamp.RED; MetaAnnotation annotationAttr() default @MetaAnnotation("lhm"); }

    枚舉和注解都是特殊的類,不能用new創(chuàng)建它們的實例對象,創(chuàng)建枚舉的實例對象就是在其中增加元素。在程序中如何創(chuàng)建出1個注解的實例對象啊?直接用@放上1個標記便可,例如:@MetaAnnotation("lhm")。
    用反射方式取得注解對應的實例對象后,再通過該對象調(diào)用屬性對應的方法:

    @ItcastAnnotation(annotationAttr=@MetaAnnotation("flx"), color="red", value="abc", arrayAttr=1) public class AnnotationTest { @SuppressWarnings("deprecation") @ItcastAnnotation("xyz") public static void main(String[] args) { System.runFinalizersOnExit(true); if(AnnotationTest.class.isAnnotationPresent(ItcastAnnotation.class)) { // 類上是不是有注解,默許情況下返回false ItcastAnnotation annotation = (ItcastAnnotation)AnnotationTest.class.getAnnotation(ItcastAnnotation.class); System.out.println(annotation.annotationAttr().value()); // flx } } @Deprecated public static void sayHello() { System.out.println("hi,李阿昀"); } }

    可以認為@ItcastAnnotation是ItcastAnnotation類的1個實例對象,一樣的道理,可以認為@MetaAnnotation是MetaAnnotation類的1個實例對象。

注解的詳細語法可以通過看java語言規(guī)范了解,即看java的language specification,可知道注解的屬性類型包括:基本數(shù)據(jù)類型,String,Class,枚舉,其他注解,和這些類型的數(shù)組

生活不易,碼農(nóng)辛苦
如果您覺得本網(wǎng)站對您的學習有所幫助,可以手機掃描二維碼進行捐贈
程序員人生
------分隔線----------------------------
分享到:
------分隔線----------------------------
關(guān)閉
程序員人生
主站蜘蛛池模板: 久久精品在线视频 | 成人免费在线观看 | 久久99精品久久久久久久 | 国产精品嫩草在线 | 亚洲视频在线免费观看 | 国产精品视频播放 | 午夜黄色大片 | 亚洲欧美一区二区三区在线 | 97成人在线视频 | 国产激情美女久久久久久吹潮 | 婷婷av在线 | 九九九精品视频 | 国产一二三区免费视频 | 欧美日韩无| 久久精品久久久久电影 | 亚洲综合成人网 | 国产精彩视频 | 日韩精品三级 | 91精品国产99久久久久久红楼 | 久久91av| 国产精品一区二区精品视频免费看 | 久久国产一区二区三区 | 国产黄色在线播放 | 亚洲午夜在线观看 | 久久久精品欧美一区二区 | 成人毛片视频免费 | 久久国产精品久久精品 | 亚洲精品视频免费观看 | 免费中文| 久久精品一级 | 伊人国产精品 | 国产精品一区二区三区在线 | 日韩欧美一区二区在线 | 91成人国产 | 欧美 中文字幕 | 日韩一区二区免费电影 | 欧美一区二区在线视频 | 一区二区视频在线 | 国产精品高潮呻吟久久av黑人 | 国产精品久久久久久久久久新婚 | 在线观看一区二区视频 |