java註解實戰

一.java註解
註解,顧名思義,註解,就是對某一事物進行添加註釋說明,會存放一些信息,這些信息可能對以後某個時段來說是很有用處的。
Java註解又叫java標註,java提供了一套機制,使得我們可以對方法、類、參數、包、域以及變量等添加標準(即附上某些信息)。且在以後某個時段通過反射將標註的信息提取出來以供使用。
二.Java標註
1.Java1.5版本以後默認內置三個標註:
Ø @Override:只能用在方法之上的,用來告訴別人這一個方法是改寫父類的。
Ø @Deprecated:建議別人不要使用舊的API的時候用的,編譯的時候會用產生警告信息,可以設定在程序裏的所有的元素上.
Ø @SuppressWarnings:這一個類型可以來暫時把一些警告信息消息關閉.
但是,僅僅這三個標註是不能滿足我們開發時一些需求的。所以java允許我們自定義註解來使用。
2.
自定義步驟大致分爲兩步:
1, 通過@interface關鍵字(注意,不是interface,是@interace)聲明註解名稱,以及註解的成員屬性或者叫做註解的參數。
2, 使用java內置的四個元註解對這個自定義標註的功能和範圍進行一些限制
問題來了,什麼是元註解
3.
元註解就是定義註解的註解,也就是說這些元註解是的作用就是專門用來約束其它註解的註解。請區別上面那三個註解,他們也是通過元註解定義而來的。
元註解有哪些呢,主要有四個@Target,@Retention,@Documented,@Inherited
1. * 元註解有:@Target,@Retention,@Documented,@Inherited
2. *
3. * @Target 表示該註解用於什麼地方,可能的 ElemenetType 參數包括:
4. * ElemenetType.CONSTRUCTOR 構造器聲明
5. * ElemenetType.FIELD 域聲明(包括 enum 實例)
6. * ElemenetType.LOCAL_VARIABLE 局部變量聲明
7. * ElemenetType.METHOD 方法聲明
8. * ElemenetType.PACKAGE 包聲明
9. * ElemenetType.PARAMETER 參數聲明
10. * ElemenetType.TYPE 類,接口(包括註解類型)或enum聲明
11. *
12. * @Retention 表示在什麼級別保存該註解信息。可選的 RetentionPolicy 參數包括:
13. * RetentionPolicy.SOURCE 註解將被編譯器丟棄
14. * RetentionPolicy.CLASS 註解在class文件中可用,但會被VM丟棄
15. * RetentionPolicy.RUNTIME VM將在運行期也保留註釋,因此可以通過反射機制讀取註解的信息。
16. *
17. * @Documented 將此註解包含在 javadoc 
18. *
19. * @Inherited 允許子類繼承父類中的註解
4.
下面講的設計一個最簡單的Annotation例子,這一例子共用四個文件; 
自定義一個類級別的標註Description
package lighter.javaeye.com;
import java.lang.annotation.Documented;
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
@Target(ElementType.TYPE)//這個標註應用於類
@Retention(RetentionPolicy.RUNTIME)//標註會一直保留到運行時
@Documented//將此註解包含在javadoc
public @interface Description {
String value();
}
再定義個方法級別的註解Name
package lighter.javaeye.com;
import java.lang.annotation.Documented;
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
//注意這裏的@Target@Description裏的不同,參數成員也不同
@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface Name {
String originate();
String community();
}
然後使用以上兩個註解
package lighter.javaeye.com;
@Description(value="javaeye,做最棒的軟件開發交流社區")
public class JavaEyer {
@Name(originate="創始人:robbin",community="javaEye")
public String getName()
{
return null;
}
@Name(originate="創始人:江南白衣",community="springside")
public String getName2()
{
return "借用兩位的id一用,寫這一個例子,請見諒!";
}
}
說明:其中標註“@Description(value="javaeye,做最棒的軟件開發交流社區")”,可以寫成“@Description("javaeye,做最棒的軟件開發交流社區") ”,結果也是一樣的。因爲Description標註定義的時候其參數(或者說屬性)value。而value比較特殊,它在被指定參數的時候可以不用顯示的寫出來。當然如果定義的時候參數名不是value而是其它的比如des,那麼使用註解的時候,必須顯示寫出參數名,然後再賦值:@Description(Des=”xxx”)
提取出註解的信息
package lighter.javaeye.com;
import java.lang.reflect.Method;
import java.util.HashSet;
import java.util.Set;
public class TestAnnotation {
/**
* author lighter
* 說明:具體關天AnnotationAPI的用法請參見javaDoc文檔
*/
public static void main(String[] args) throws Exception {
String CLASS_NAME = "lighter.javaeye.com.JavaEyer";
Class test = Class.forName(CLASS_NAME);
Method[] method = test.getMethods();
boolean flag = test.isAnnotationPresent(Description.class);
if(flag)
{
Description des = (Description)test.getAnnotation(Description.class);//注意:是類.class.getAnnotation()
System.out.println("描述:"+des.value());
System.out.println("-----------------");
}
//JavaEyer這一類有利用到@Name的全部方法保存到Set中去
Set<Method> set = new HashSet<Method>();
for(int i=0;i<method.length;i++)
{
boolean otherFlag = method[i].isAnnotationPresent(Name.class); //注意是method[i],不是類.class
if(otherFlag) set.add(method[i]);
}
for(Method m: set)
{
Name name = m.getAnnotation(Name.class);//注意是method.getAnnotation,不是類.class.getAnnotation
System.out.println(name.originate());
System.out.println("創建的社區:"+name.community());
}
}
}
注意事項:
所有的Annotation會自動繼承java.lang.annotation這一個接口,所以不能再去繼承別的類或是接口.
最重要的一點,Annotation類型裏面的參數該怎麼設定:
第一,只能用public或默認(default)這兩個訪問權修飾.例如,String value();這裏把方法設爲defaul默認類型.
第二,參數成員只能用基本類型byte,short,char,int,long,float,double,boolean八種基本數據類型和String,Enum,Class,annotations等數據類型,以及這一些類型的數組.例如,String value();這裏的參數成員就爲String.
發佈了33 篇原創文章 · 獲贊 24 · 訪問量 33萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章