Annotation詳解

轉自:http://www.doc88.com/p-995532241886.htmlhtml

首先咱們定義一個簡單的註解java

 1 package com.qjy.annotation;
 2 
 3 import java.lang.annotation.Documented;
 4 import java.lang.annotation.ElementType;
 5 import java.lang.annotation.Retention;
 6 import java.lang.annotation.RetentionPolicy;
 7 import java.lang.annotation.Target;
 8 
 9 @Target(ElementType.TYPE)
10 @Retention(RetentionPolicy.RUNTIME)
11 @Documented
12 public @interface MyAnnotation1 {
13     String value();
14 }

java用 @interface Annotation{ } 定義一個註解 @Annotation,一個註解是一個類。註解至關於一種標記,在程序中加上了註解就等於爲程序加上了某種標記,之後,JAVAC編譯器,開發工具和其餘程序能夠用反射來了解你的類以及各類元素上有無任何標記,看你有什麼標記,就去幹相應的事。ide

 

@interface工具

  java用@interface MyAnnotation1定義一個註解開發工具

@Targetthis

  代表註解標註位置。spa

  ElementType枚舉有:命令行

     1)TYPE          類、接口、enum聲明code

     2)FIELD          域、屬性聲明htm

   3)METHOD          方法聲明

   4)PARAMETER         參數聲明

   5)CONSTRUCTOR      構造方法聲明

   6)PACKAGE         包聲明

   7)ANNOTATION_TYPE    註釋類型聲明

   8)LOCAL_VARIABLE    局部變量聲明

@Retention

  代表該註解類的生命週期。

  RetentionPolicy枚舉有:

  1)SOURCE  在源文件中有效

  2)CLASS    在class文件中有效 

  3)RUNNTIME  在運行時有效

  只有指定註解RetentionPolicy.RUNNTIME,咱們才能夠在註解處理器中經過反射讀取

@Documented

  代表此註解是否包含在javadoc中

 

接下來,咱們定義一個包含兩個值的註解

 1 package com.qjy.annotation;
 2 
 3 import java.lang.annotation.Documented;
 4 import java.lang.annotation.ElementType;
 5 import java.lang.annotation.Retention;
 6 import java.lang.annotation.RetentionPolicy;
 7 import java.lang.annotation.Target;
 8 
 9 @Target(ElementType.METHOD)
10 @Retention(RetentionPolicy.RUNTIME)
11 @Documented
12 public @interface MyAnnotation2 {
13     String description();
14     boolean isAnnotation();
15 }

 

下面咱們看下這兩個註解的用法

1 package com.qjy.annotation;
2 
3 @MyAnnotation1(value="this is annotation1")
4 public class AnnotationDemo {
5     @MyAnnotation2(description="this is Annotation2",isAnnotation=true)
6     public void sayhello(){
7         System.out.println("hello world");
8     }
9 }

當咱們互換@MyAnnotation1和@MyAnnotation2時,ide會報錯,這就是@Target做用啦!

 

下面咱們經過命令行執行:javadoc -d doc *.java,生成javadoc文檔。註解MyAnnotation2使用@Documented時,文檔方法以下:

 

若是不使用@Documented時,文檔以下:

這就是@Documented做用啦!

 

下面咱們編寫一個完整的自定義註解。

第一步:編寫一個用於對象賦值的註解

 1 package com.qjy.annotation;
 2 
 3 import java.lang.annotation.Documented;
 4 import java.lang.annotation.ElementType;
 5 import java.lang.annotation.Retention;
 6 import java.lang.annotation.RetentionPolicy;
 7 import java.lang.annotation.Target;
 8 
 9 @Target(ElementType.METHOD)
10 @Retention(RetentionPolicy.RUNTIME)
11 @Documented
12 public @interface ValueBind {
13     enum fieldType{STRING,INT};
14     fieldType type();
15     String value();
16 }

第二步:使用註解

 1 package com.qjy.annotation;
 2 
 3 import com.qjy.annotation.ValueBind.fieldType;
 4 
 5 public class Student {
 6     private String name = "";
 7     private int age = 0;
 8     private String studentid = "";
 9     
10     public String getName() {
11         return name;
12     }
13         
14     @ValueBind(type=fieldType.STRING,value="aa")
15     public void setName(String name) {
16         this.name = name;
17     }
18     public int getAge() {
19         return age;
20     }
21     
22     @ValueBind(type=fieldType.INT,value="25")
23     public void setAge(int age) {
24         this.age = age;
25     }
26     public String getStudentid() {
27         return studentid;
28     }
29     
30     @ValueBind(type=fieldType.STRING,value="101")
31     public void setStudentid(String studentid) {
32         this.studentid = studentid;
33     }
34     
35     @Override
36     public String toString() {
37         return "Student [name=" + name + ", age=" + age + ", studentid="
38                 + studentid + "]";
39     }
40     
41 }

第三步:編寫註解處理器

 1 package com.qjy.annotation;
 2 
 3 import java.lang.reflect.Method;
 4 
 5 /**
 6  * 註解處理器
 7  * 
 8  * @author admin
 9  *
10  */
11 public class PersistStudent {
12     public static void main(String[] args) throws Exception{
13         
14         Object obj = Class.forName("com.qjy.annotation.Student").newInstance();
15         //獲取類全部方法(包含私有)
16         Method[] methodArray = obj.getClass().getDeclaredMethods();
17         
18         for(int i = 0; i < methodArray.length; i ++) {
19             //若是該方法上存在ValueBind註解
20             if(methodArray[i].isAnnotationPresent(ValueBind.class)) {
21                 ValueBind annotation = methodArray[i].getAnnotation(ValueBind.class);
22                 String type = String.valueOf(annotation.type());
23                 String value = annotation.value();
24                 //根據類型,執行set方法
25                 if(type.equals("INT")) {
26                     methodArray[i].invoke(obj, new Integer[]{new Integer(value)});
27                 } else {
28                     methodArray[i].invoke(obj, new String[]{value});
29                 }
30             }
31         }
32         
33         System.out.println(obj.toString());
34         
35     }
36 }

 

運行結果爲:

Student [name=aa, age=25, studentid=101]

 

若是將ValueBind中Retention改成:@Retention(RetentionPolicy.SOURCE)或者@Retention(RetentionPolicy.CLASS),運行結果爲:

Student [name=, age=0, studentid=]

咱們就沒法經過反射獲取註解指定的值。

相關文章
相關標籤/搜索