多多色-多人伦交性欧美在线观看-多人伦精品一区二区三区视频-多色视频-免费黄色视屏网站-免费黄色在线

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

注解(一)——注解入門

來源:程序員人生   發布時間:2016-12-06 11:04:32 閱讀次數:3139次

注解


Annotation(注解)概述

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

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

了解注解及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個類中調用這個方法。

    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結合講授。

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

注解的利用結構圖

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

自定義注解及其利用

定義新的Annotation類型使用@interface關鍵字。

  • 定義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,李阿昀"); } }

    發現控制臺無任何反應,根據反射測試的問題,引出@Retention元注解的講授。

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

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

    分別對應:java源文件→class文件→內存中的字節碼。也即1個Java類具有3種狀態:

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

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

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

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

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

    就可以正確打印了。
    結論我們寫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,原來加在類上的注解就報錯了,改成用數組方式設置{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(); }

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

    @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(); }

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

    @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")

為注解增加高級屬性

  • 數組類型的屬性

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

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

    @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,李阿昀"); } }

    注意:如果數組屬性中只有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; }

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

    @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創建它們的實例對象,創建枚舉的實例對象就是在其中增加元素。在程序中如何創建出1個注解的實例對象啊?直接用@放上1個標記便可,例如:@MetaAnnotation("lhm")
    用反射方式取得注解對應的實例對象后,再通過該對象調用屬性對應的方法:

    @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語言規范了解,即看java的language specification,可知道注解的屬性類型包括:基本數據類型,String,Class,枚舉,其他注解,和這些類型的數組

生活不易,碼農辛苦
如果您覺得本網站對您的學習有所幫助,可以手機掃描二維碼進行捐贈
程序員人生
------分隔線----------------------------
分享到:
------分隔線----------------------------
關閉
程序員人生
主站蜘蛛池模板: 国产成人精品亚洲一区 | 国产一二三四区中 | 97av在线 | 中文字幕在线免费观看 | 国产精品高清一区二区 | 欧美成人 综合网播九公社 欧美成人18 | 国产成人亚洲综合91精品555 | 亚洲精品一区二区乱码在线观看 | 国产成人免费片在线观看 | 久久久久久毛片免费观看 | 最近免费中文字幕大全免费版视频 | 免费视频精品一区二区三区 | 最近中文字幕免费完整国语 | 久久久久无码国产精品一区 | 久久久国产成人精品 | 国内成人免费视频 | 大焦伊人| 亚洲一区二区三区久久精品 | 亚洲国产一区二区三区精品 | 伊人久久综合成人亚洲 | 日韩欧美亚洲每日更新网 | 亚洲色大成网站www 亚洲色大成网站www久久九九 | 欧美性xxxx极品hd欧美 | 国产成人一区二区三区小说 | 色欧美在线| 亚洲欧美日韩一区二区 | 不卡午夜视频 | 精品推荐国产麻豆剧传媒 | 国产精品视_精品国产免费 国产精品视频1区 | 日本在线免费 | 国内精品久久久久影院中国 | 亚洲视频在线观看不卡 | 亚洲福利一区二区三区 | 国产成人精品一区二区三在线观看 | 最近的中文字幕手机在线看免费 | 亚洲成人福利在线 | 日本大臿亚洲香蕉大片 | 一区二区三区在线看 | 国产一区二区免费福利片 | 欧美男男激情videos高清不卡 | 最新99国产成人精品视频免费 |