本文介紹了java的自定義注解及注解類編寫的規則, 并通過實例來說明下如何使用java的注解. 實例演示了注解在類,構造方法,方法和字段的使用. 可以從這里下載到完成的工程代碼: http://dl.iteye.com/topics/download/f74972df-234f-30c9-aadd-ca2ed1376bc2
自定義注解類編寫的一些規則:
1. Annotation型定義為@interface, 所有的Annotation會自動繼承java.lang.Annotation這一接口,并且不能再去繼承別的類或是接口.
2. 參數成員只能用public或默認(default)這兩個訪問權修飾
3. 參數成員只能用基本類型byte,short,char,int,long,float,double,boolean八種基本數據類型和String、Enum、Class、annotations等數據類型,以及這一些類型的數組.
4. 要獲取類方法和字段的注解信息,必須通過Java的反射技術來獲取 Annotation對象,因為你除此之外沒有別的獲取注解對象的方法
5. 注解也可以沒有定義成員, 不過這樣注解就沒啥用了
自定義注解類時, 可以指定目標 (類、方法、字段, 構造函數等) , 注解的生命周期(運行時,class文件或者源碼中有效), 是否將注解包含在javadoc中及是否允許子類繼承父類中的注解, 具體如下:
1. @Target 表示該注解目標,可能的 ElemenetType 參數包括:
ElemenetType.CONSTRUCTOR 構造器聲明ElemenetType.FIELD 域聲明(包括 enum 實例) ElemenetType.LOCAL_VARIABLE 局部變量聲明 ElemenetType.METHOD 方法聲明 ElemenetType.PACKAGE 包聲明 ElemenetType.PARAMETER 參數聲明 ElemenetType.TYPE 類,接口(包括注解類型)或enum聲明
2. @Retention 表示該注解的生命周期,可選的 RetentionPolicy 參數包括
RetentionPolicy.SOURCE 注解將被編譯器丟棄 RetentionPolicy.CLASS 注解在class文件中可用,但會被VM丟棄 RetentionPolicy.RUNTIME VM將在運行期也保留注釋,因此可以通過反射機制讀取注解的信息3. @Documented 指示將此注解包含在 javadoc 中
4. @Inherited 指示允許子類繼承父類中的注解
好, 該介紹的介紹了, 看下自定義的注解應用實例:
1. 首先看下定義的注解類:
類注解定義, MyClassAnnotation.java:
[java] view plain copypackage com.ross.annotation; import java.lang.annotation.*; /** * Author: Jiangtao He; Email: ross.jiangtao.he@Gmail.com * Date: 2012-1-29 * Since: MyJavaExpert v1.0 * Description: class annotation */ @Retention (RetentionPolicy.RUNTIME) @Target (ElementType.TYPE) public @interface MyClassAnnotation { String uri(); String desc(); } 默認構造方法注解定義,MyConstructorAnnotation.java: [java] view plain copypackage com.ross.annotation; import java.lang.annotation.ElementType; import java.lang.annotation.Retention; import java.lang.annotation.RetentionPolicy; import java.lang.annotation.Target; /** * Author: Jiangtao He; Email: ross.jiangtao.he@gmail.com * Date: 2012-1-29 * Since: MyJavaExpert v1.0 * Description: Constructor annotation */ @Retention (RetentionPolicy.RUNTIME) @Target (ElementType.CONSTRUCTOR) public @interface MyConstructorAnnotation { String uri(); String desc(); } 方法注解定義,MyMethodAnnotation.java:[java] view plain copypackage com.ross.annotation; import java.lang.annotation.ElementType; import java.lang.annotation.Retention; import java.lang.annotation.RetentionPolicy; import java.lang.annotation.Target; /** * Author: Jiangtao He; Email: ross.jiangtao.he@gmail.com * Date: 2012-1-29 * Since: MyJavaExpert v1.0 * Description: method annotation */ @Retention (RetentionPolicy.RUNTIME) @Target (ElementType.METHOD) public @interface MyMethodAnnotation { String uri(); String desc(); } 字段注解定義, MyFieldAnnotation.java:[java] view plain copypackage com.ross.annotation; import java.lang.annotation.ElementType; import java.lang.annotation.Retention; import java.lang.annotation.RetentionPolicy; import java.lang.annotation.Target; /** * Author: Jiangtao He; Email: ross.jiangtao.he@gmail.com * Date: 2012-1-29 * Since: MyJavaExpert v1.0 * Description: field annotation */ @Retention (RetentionPolicy.RUNTIME) @Target (ElementType.FIELD) public @interface MyFieldAnnotation { String uri(); String desc(); } 2. 再看下我們注解的應用和測試:在類上面使用了MyClassAnnotation注解, 默認構造方法上使用了MyConstructorAnnotation注解, 自定義方法上使用了MyMethodAnnotation注解, 自定義字段上使用了MyFieldAnnotation注解, 在Mail函數中則實現了訪問這些注解,并打印注解信息.
MySample.java:
[java] view plain copypackage com.ross.annotation; import java.lang.reflect.*; /** * Author: Jiangtao He; Email: ross.jiangtao.he@gmail.com * Date: 2012-1-29 * Since: MyJavaExpert v1.0 * Description: This class is used to show how to use the annotation of each level */ @MyClassAnnotation (uri = "com.ross.MySample" , desc = "The class name" ) public class MySample { @MyFieldAnnotation (uri = "com.ross.MySample#id" , desc = "The class field" ) public String id; /** * Description: default constructor */ @MyConstructorAnnotation (uri = "com.ross.MySample#MySample" , desc = "The default constuctor" ) public MySample() { } /** * Description: normal method */ @MyMethodAnnotation (uri = "com.ross.MySample#setId" , desc = "The class method") public void setId(String id) { this .id = id; } /** * Description: MyAnnotation test * @throws NoSuchMethodException * @throws SecurityException * @throws NoSuchFieldException */ public static void main(String[] args) throws SecurityException, NoSuchMethodException, NoSuchFieldException { MySample oMySample = new MySample(); // get class annotation MyClassAnnotation oMyAnnotation = MySample.class .getAnnotation(MyClassAnnotation.class ); System.out.控制臺打印結果:
[plain] view plain copyClass's uri: com.ross.MySample; desc: The class name Constructor's uri: com.ross.MySample#MySample; desc: The default constuctor Method's uri: com.ross.MySample#setId; desc: The class method Field's uri: com.ross.MySample#id; desc: The class field至此本實例就完成了, 其實就是抓住兩點一個是定義注解類,另外一個是如何訪問注解, 就算是學會了.
注: 轉載請注明出處: http://hejiangtao.iteye.com , 用于商業得給我分成
MyJavaExpert_V1.0-java注解應用實例.rar (10.1 KB)下載次數: 2404 頂3 踩分享到:![]()
Java Compiler 應用實例 | Java 序列化的高級認識--序列化反序列化, ...2012-01-29 21:35瀏覽 18605評論(1)分類:編程語言相關推薦
參考知識庫
人工智能知識庫10736 關注 | 521 收錄
Python知識庫20226 關注 | 1334 收錄
Java SE知識庫23461 關注 | 468 收錄
微信開發知識庫19036 關注 | 776 收錄
評論
1 樓 beiyeren 2013-03-02 寫的不錯啊發表評論
您還沒有登錄,請您登錄后再發表評論
hejiangtao瀏覽: 75596 次性別:
來自: 杭州
最近訪客 更多訪客>>
wtxczwtxcz
snowrainbow
東林碣石
hello2017
文章分類
全部博客 (13)java (12)網絡 (1)網絡編程 (1)社區版塊
我的資訊 (0)我的論壇 (0)我的問答 (0)存檔分類
2012-10 (2)2012-03 (1)2012-02 (1)更多存檔...最新評論
硯臺觀月: 你好,例子還有嗎,我想要份學習看下。提供的鏈接找不到了。java網絡編程之Http多線程下載應用實例xianghanscce: ...java泛型應用實例 - 自定義泛型類,方法yhx1231: ...Java反射應用實例beiyeren: 寫的不錯啊java注解應用實例 - Annotation, 自定義注解, 注解類規則xuanxuan.good: 請問你是如何測試的.謝謝java反射的性能問題 (轉)
新聞熱點
疑難解答