1.Annotation簡介
Annotation實際上表示一種註釋的語法,java中最先的程序是提倡代碼與配置相分離,而最新的理論又是將全部的配置直接寫入到程序中去,那麼若是想要完成這樣的功能,則須要使用Annotation. html
JDK1.5以後的新特性:枚舉,自動裝箱拆箱,foreach,可變參數,靜態導入,泛型. java
2.系統內建的Annotation
-
@Override ide
-
@Deprecated 學習
-
@SupressWarnings spa
2.1 @Override
@Override表示正確的覆寫操做. code
示例: orm
父類代碼 htm
public class Person { public String say(){ return "人在說話。" ; } }
public class Studnt extends Person { @Override public String say(){ return "學生在說話" ; } }
@Override能夠保證正確的覆寫,若是一個方法聲明瞭覆寫,而實際上覆寫有問題就會提示出錯誤. 對象
2.2 @Deprecated
@Deprecated表示不建議使用的操做. 繼承
示例:
public class Info { @Deprecated public String getInfo(){ return "hello" ; } }getInfo這個方法就是不建議使用的操做 ,在代碼中會用中劃線表示警告 ,可是不影響實際使用 .
2.3 @SupressWarnings
@SupressWarnings表示壓制警告.
示例:
public class TestInfo { @SuppressWarnings("deprecation") public static void main(String[] args) { new Info().getInfo() ; } }注意的是 SupressWarnings能夠壓制多個警告 .
示例:
import java.io.Serializable; @SuppressWarnings({ "serial", "deprecation" }) public class Person extends Info implements Serializable { }
使用過程當中,能夠明確表示出是爲 SuppressWarnings中的value屬性賦值.
import java.io.Serializable; @SuppressWarnings(value = { "serial", "deprecation" }) public class Person extends Info implements Serializable { }
3.自定義Annotation
定義Annotation的語法:
public @Annotation
示例:
public @interface MyAnnotation { public String key() ; public String value() ; }如今若是要使用此 Annotation,不在同一個包中須要導入 ,導入以後使用 @Annotation的訪問語法 .
示例:
@MyAnnotation(key = "ARES", value = "19") public class Info { }
注:能夠爲Annotation定義默認的屬性.
public @interface MyAnnotation { public String key() default "ARES"; public String value() default "19"; }
Annotation能夠經過枚舉類型制定範圍 .
示例:
Color類:
public enum Color { RED, GREEN, BLUE; }MyAnnotation類 :
public @interface MyAnnotation { public String key() default "ARES"; public String value() default "19"; public Color color() default Color.RED ; }
4.Rentention和RententionPolicy
在java.lang.annotation中定義了全部與之相關的操做,Rentention自己是一個 Annotation,其中的取值是經過RententionPolicy這個枚舉類型制定的.RententionPolicy規定了一下三種範圍:
-
源碼中起做用:public static final RetentionPolicy SOURCE
-
編譯後的class中起做用:public static final RetentionPolicy CLASS
-
運行的時候起做用:public static final RetentionPolicy RUNTIME
若是一個Annotation要起做用,則必須使用RUNTIME範圍.
5.反射與Annotation
一個Annotation要想起做用,則必須依靠反射機制,經過反射機制能夠取得一個方法在Annotation上聲明的所有內容.
取得所有的Annotation.
示例:
import java.lang.annotation.*; @Retention(value=RetentionPolicy.RUNTIME) public @interface MyAnnotation { public String key() default "ARES"; public String value(); }
Info類:
package com.ares.demo; public class Info { @Override @Deprecated @SuppressWarnings(value = "") @MyAnnotation(key = "ARES", value = "19") public String toString() { return "hello"; } }以上三個 Annotation,只有 @Deprecated 是 RUNTIME範圍的 .因此運行時 ,只有運行時只有 @Deprecated 能夠取到 .
示例:
package com.ares.demo; import java.lang.annotation.Annotation; import java.lang.reflect.Method; public class ClassAnnotationDemo { public static void main(String[] args) throws Exception { Class<?> cls = Class.forName("com.ares.demo.Info"); Method toStringMethod = cls.getMethod("toString"); Annotation ans[] = toStringMethod.getAnnotations();// 取得所有的Annotation for (int i = 0; i < ans.length; i++) { System.out.println(ans[i]) ; } } }
6.自定義RUNTIME的Annotation
示例:
package com.ares.demo12; import java.lang.annotation.*; @Documented @Target(value = { ElementType.METHOD, ElementType.TYPE }) @Retention(value = RetentionPolicy.RUNTIME) public @interface MyAnnotation { public String key() default "ARES"; public String value() default "ARES"; }
經過反射取得Annotation:
package com.ares.demo; import java.lang.annotation.Annotation; import java.lang.reflect.Method; public class ClassAnnotationDemo { public static void main(String[] args) throws Exception { Class<?> cls = Class.forName("com.ares.demo.Info"); Method toStringMethod = cls.getMethod("toString"); Annotation ans[] = toStringMethod.getAnnotations();// 取得所有的Annotation for (int i = 0; i < ans.length; i++) { if (toStringMethod.isAnnotationPresent(MyAnnotation.class)) { MyAnnotation my = null; // 聲明Annotation的對象 my = toStringMethod.getAnnotation(MyAnnotation.class) ; String key = my.key() ; String value = my.value() ; System.out.println(key + " --> " + value) ; } } } }
實際開發中不用過多關注這些底層的實現,程序中爲其提供支持.
7.Annotation深刻
①自定義Annotation能夠在程序的任意位置使用.
示例:
package com.ares.demo; @MyAnnotation public class Info { private String name ; @MyAnnotation public String toString() { return "hello" ; } }
注:實際上咱們能夠爲Annotation制定使用範圍.
②設置Annotation的使用範圍.(實際有8種範圍,能夠查看手冊)
制定範圍示例:
package com.ares.demo; import java.lang.annotation.*; @Target(value = { ElementType.METHOD, ElementType.TYPE }) @Retention(value = RetentionPolicy.RUNTIME) public @interface MyAnnotation { public String key() default "ARES"; public String value() default "ARES"; }
③Documented註釋
註釋格式:
package com.ares.demo; import java.lang.annotation.*; @Documented @Target(value = { ElementType.METHOD, ElementType.TYPE }) @Retention(value = RetentionPolicy.RUNTIME) public @interface MyAnnotation { public String key() default "ARES"; public String value() default "ARES"; }
在使用類中加入文檔註釋:
package com.ares.demo; @MyAnnotation public class Info { private String name ; /** * 本方法是覆寫Object類中的toString()方法 */ @MyAnnotation public String toString() { return "hello" ; } }
用文檔註釋的最大好處是能夠導出doc文檔.相似官方文檔的html格式文檔.
8.Inherited
表示此Annotation可否繼續被子類繼承下去,若是沒有寫上此註釋,表示此Annotation根本就是沒法被繼承的.
示例:
package com.ares.demo; import java.lang.annotation.*; @Inherited @Documented @Target(value = { ElementType.METHOD, ElementType.TYPE }) @Retention(value = RetentionPolicy.RUNTIME) public @interface MyAnnotation { public String key() default "ARES"; public String value() default "ARES"; }此時表示能夠被子類繼承 .
20150529
JAVA學習筆記系列
--------------------------------------------
聯繫方式
--------------------------------------------
Weibo: ARESXIONG
E-Mail: aresxdy@gmail.com
------------------------------------------------