最近看到不少項目都是用了自定義註解,例如java
1.什麼是註解?數據庫
元數據(metadata),就是指數據的數據,元數據是描述數據的,就像數據庫中的,表的字段,每個數組
字段描述這個字段下面·的數據的含義,j2Se5.0中提供的註釋就是java源代碼的源數據,註釋就是描述ide
java源代碼的。使用@後面跟註解工具
簡單一點:開發工具
一個註解是一個類spa
註解至關於一種標記,在程序中加上了註解就等於爲程序加上了某種標記,之後,
JAVAC編譯器,開發工具和其餘程序能夠用反射來了解你的類以及各類元素上有無任何標記,看你有什麼標記,就去幹相應的事。3d
註解@Override用在方法上,當咱們想重寫一個方法時,在方法上加@Override,當咱們方法
的名字出錯時,編譯器就會報錯,如圖:blog
註解@SuppressWarnings用來壓制程序中出來的警告,好比在沒有用泛型或是方法已通過時的時候,繼承
2.J2SE5.0中預約義的註釋
在J2SE5.0的java.lang包中預約義了三個註釋。它們是Override、Deprecated和SuppressWarnings。下面分別解釋它們的含義。
1.Override註釋:僅用於方法(不可用於類、包的生命或其餘),指明註釋的方法將覆蓋超類中的方法(若是覆蓋父類的方法而沒有注
釋就沒法編譯該類),註釋還能確保註釋父類方法的拼寫是正確(錯誤的編寫,編譯器不認爲是子類的新方法,而會報錯)
2.@Deprecated註釋:對不該再使用的方法進行註釋,與正在聲明爲過期的方法放在同一行。使用被 Deprecated註釋的方法,編譯器會
提示方法過期警告(」Warring」)
3.@SuppressWarnings註釋:單一註釋,能夠經過數組提供變量,變量值指明要阻止的特定類型警告(忽略某些警告)。數組中的變量指明要阻止的警告 @SuppressWarnings(value={」unchecked」,」fallthrough」}))
這個作了解就能夠了
3.java中的自定義註解 (@interface)
它相似於新建立一個接口類文件,但爲了區分,咱們須要將它聲明爲@interface
@interface:註釋聲明,定義註釋類型(與默認的Override等三種註釋類型相似)。請看下面實例:
4.@Target做用
指定程序元定義的註解所使用的地方,它使用了另外一個類:ElementType,是一個枚舉類定義了註釋類型能夠應用到不一樣的程序元素以避免使用者誤用
TYPE, // 指定適用點爲 class, interface, enum
FIELD, // 指定適用點爲 field
METHOD, // 指定適用點爲 method
PARAMETER, // 指定適用點爲 method 的 parameter
CONSTRUCTOR, // 指定適用點爲 constructor
LOCAL_VARIABLE, // 指定使用點爲 局部變量
ANNOTATION_TYPE, //指定適用點爲 annotation 類型
PACKAGE // 指定適用點爲 package
5.@Retention做用
這個元註釋和java編譯器處理註釋的註釋類型方式相關,告訴編譯器在處理自定義註釋類型的幾種不一樣的選擇,須要使用RetentionPolicy枚舉類。此枚舉類只有一個 成員變量,能夠不用指明成名名稱而賦值
類中有個RetentionPolicy類,也是一個枚舉類,具體看代碼:
public enum RetentionPolicy {
SOURCE, // 編譯器處理完Annotation後不存儲在class中
CLASS, // 編譯器把Annotation存儲在class中,這是默認值
RUNTIME // 編譯器把Annotation存儲在class中,能夠由虛擬機讀取,反射須要
}
6.@Documented
是一個標記註釋,表示註釋應該出如今類的javadoc中,由於在默認狀況下注釋時不包括在javadoc中的。
因此若是花費了大量的時間定義一個註釋類型,並想描述註釋類型的做用,可使用它。
注意他與@Retention(RetentionPolicy.RUNTIME)配合使用,由於只有將註釋保留在編譯後的類文件中由虛擬機加載,
而後javadoc才能將其抽取出來添加至javadoc中。
7. @Inherited
若是一個方法使用了的註釋用了@inherited,
那麼其子類的該方法一樣繼承了該註釋
8.小例子
package zhujei2;
import java.lang.annotation.Documented;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
@Documented
@Retention(RetentionPolicy.RUNTIME)
public @interface Person{
String name();
int age();
}
package zhujei2;
@Person(name="我愛你",age=250)
public class test2 {
public static void print(Class c){
System.out.println(c.getName());
//java.lang.Class的getAnnotation方法,若是有註解,則返回註解。不然返回null
Person person = (Person)c.getAnnotation(Person.class);
if(person != null){
System.out.println("name:"+person.name()+" age:"+person.age());
}else{
System.out.println("person unknown!");
}
}
public static void main(String[] args){
test2.print(test2.class);
}
}