java注解编程_java 注解 基本原理 编程实现
java 1.5開(kāi)始引入了注解和反射,正確的來(lái)說(shuō)注解是反射的一部分,沒(méi)有反射,注解無(wú)法正常使用,但離開(kāi)注解,反射依舊可以使用,因此來(lái)說(shuō),
反射的定義應(yīng)該包含注解才合理一些。當(dāng)然,這只是個(gè)人想法,至于java官方為什么這么涇渭分明不得而知,最重要的是如何使用注解。
注解的功能分為2部分:
作為特定的標(biāo)記
額外信息的載體
定義一個(gè)UserAnnotation注解類
1 @Target(value ={ ElementType.FIELD })2 @Retention(RetentionPolicy.RUNTIME)3 public @interfaceUserAnnotation {4 public int id() default 0;5 public String name() default "";6 public int age() default 18;7 public String gender() default "M";8 }
其中@target個(gè)@Retention本身就是注解
【@target】這個(gè)注解來(lái)指定給哪一類java成員注解,指定注解目標(biāo)該是什么樣的東西
注解@Target的源碼
1 @Documented2 @Retention(RetentionPolicy.RUNTIME)3 @Target(ElementType.ANNOTATION_TYPE) //這不是在作弊,這確實(shí)是自己注解自己,所以說(shuō)注解也可以被字節(jié)給注解
4 public @interfaceTarget {5 ElementType[] value(); //值可以使數(shù)組 value={...}
6 }7
8 public enumElementType {9 TYPE, //給類(型)注解
10 FIELD, //給字段注解,不要忘了,字段可以是對(duì)象
11 METHOD, //給方法注解
12 PARAMETER, //給參數(shù)注解
13 CONSTRUCTOR, //給構(gòu)造方法注解
14 LOCAL_VARIABLE, //給局部變量注解
15 ANNOTATION_TYPE,//給注解注解(這貌似把自己不當(dāng)類來(lái)看)
16 PACKAGE, //給包注解
17 TYPE_PARAMETER, //不知道,等知道了我再寫(xiě)在這里
18 TYPE_USE //這個(gè)也不知道
19 }
【@Retention】表示注解運(yùn)行的狀態(tài),換句話說(shuō),注解改在什么樣的狀態(tài)下才能運(yùn)行
注解@Retention的源碼
1 @Documented2 @Retention(RetentionPolicy.RUNTIME)3 @Target(ElementType.ANNOTATION_TYPE)4 public @interfaceRetention {5 RetentionPolicy value();6 }7
8 public enumRetentionPolicy {9 SOURCE, //源碼狀態(tài)運(yùn)行,
10 CLASS, //編譯類文件時(shí)運(yùn)行
11 RUNTIME //運(yùn)行時(shí)運(yùn)行
12 }
一般來(lái)說(shuō),源碼狀態(tài)運(yùn)行和編譯狀態(tài)運(yùn)行的注解往往和編譯器相關(guān),比如報(bào)錯(cuò),警告,類編譯參數(shù)等,這2類狀態(tài)一般和編輯器插件關(guān)系密切,這里不再討論
在日常開(kāi)發(fā)中RUNTIME用的最多,這是開(kāi)發(fā)人員可以控制的一個(gè)狀態(tài)。
【@Documented】額,不多解釋,具體來(lái)說(shuō)是生成說(shuō)明文檔時(shí)把類的解釋添加進(jìn)去。
關(guān)于注解的方法說(shuō)明,注解只有方法,沒(méi)有字段,因?yàn)樽⒔庖彩且粋€(gè)interface,只不過(guò)前面加了一個(gè)@符號(hào),還有一點(diǎn)是這些方法無(wú)法實(shí)現(xiàn),寫(xiě)法和C++的純虛函數(shù)相似
請(qǐng)看id()方法的解釋
1 public int id() default 0;2 /*首先,方法必須是public的,去掉public,默認(rèn)也是public,接口interface不也是這樣么3 *4 *其次,default默認(rèn)值不是必須的,方法必須有返回值,返回值可以是java中復(fù)雜對(duì)象,也可以是基本類型,枚舉都行5 *如 ElementType[] value();6 */
注解定義好了,怎么使用呢,如下
1 public classTestMain2 {3 @UserAnnotation(age=20,gender="F",id=2014,name="zhangsan")//注解的使用
4 privateObject obj;5
6 public static void main(String[] args) throwsException7 {8 Filed objField = TestMain.class.getField("obj");9 UserAnnotation ua = objField.getAnnotation(UserAnnotation.class);//得到注解,起到了標(biāo)記的作用
10
11 System.out.println(ua.age()+","+ua.gender()+","+ua.id()+","+ua.name());12 //***進(jìn)一步操作的話,假設(shè)Object要指向一個(gè)User類,那么可以講注解的值給他
13 TestMain tm = newTestMain();14 objFiled.set(tm,new User(ua.age(),ua.gender(),ua.id(),ua.name())); //不錯(cuò)吧,將自己的信息送給obj,起到了附加信息的作用15
16 //-----------請(qǐng)自由遐想吧~~,下面來(lái)說(shuō)說(shuō)注解怎么能獲得注解自己的注解-------------
17 Target t = ua.annotationType().getAnnotation(Target.class)18 ElementType[] values =t.value();19 //~~~~~~~~~~~~~~完了,再一次自由遐想吧~~~~~~~~~~~~~~
20
21 Sysout.out.println("注意:是遐想,不是瞎想!!");22 }23 }
總結(jié)
以上是生活随笔為你收集整理的java注解编程_java 注解 基本原理 编程实现的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: java jstat gcutil_ja
- 下一篇: java实现混合运算_java图形化界面