【轉】 java自定義註解

IT一族發表於2013-07-02

 java註解是附加在程式碼中的一些元資訊,用於一些工具在編譯、執行時進行解析和使用,起到說明、配置的功能。
註解不會也不能影響程式碼的實際邏輯,僅僅起到輔助性的作用。包含在 java.lang.annotation 包中。

1、元註解

元註解是指註解的註解。包括  @Retention @Target @Document @Inherited四種。


1.1、@Retention: 定義註解的保留策略

@Retention(RetentionPolicy.SOURCE)   //註解僅存在於原始碼中,在class位元組碼檔案中不包含
@Retention(RetentionPolicy.CLASS)     // 預設的保留策略,註解會在class位元組碼檔案中存在,但執行時無法獲得,
@Retention(RetentionPolicy.RUNTIME)  // 註解會在class位元組碼檔案中存在,在執行時可以通過反射獲取到
 
1.2、@Target:定義註解的作用目標
其定義的原始碼為: 
  1. @Documented  
  2. @Retention(RetentionPolicy.RUNTIME)  
  3. @Target(ElementType.ANNOTATION_TYPE)  
  4. public @interface Target {  
  5.     ElementType[] value();  
  6. }  
@Target(ElementType.TYPE)   //介面、類、列舉、註解
@Target(ElementType.FIELD) //欄位、列舉的常量
@Target(ElementType.METHOD) //方法
@Target(ElementType.PARAMETER) //方法引數
@Target(ElementType.CONSTRUCTOR)  //建構函式
@Target(ElementType.LOCAL_VARIABLE)//區域性變數
@Target(ElementType.ANNOTATION_TYPE)//註解
@Target(ElementType.PACKAGE) ///   
 由以上的原始碼可以知道,他的elementType 可以有多個,一個註解可以為類的,方法的,欄位的等等
1.3、@Document:說明該註解將被包含在javadoc中
 
1.4、@Inherited:說明子類可以繼承父類中的該註解
 
2、java 註解的自定義
      下面是自定義註解的一個例子
  1. @Documented  
  2. @Target({ElementType.TYPE,ElementType.METHOD})  
  3. @Retention(RetentionPolicy.RUNTIME)  
  4. public @interface Yts {  
  5.    public enum YtsType{util,entity,service,model}  
  6.      
  7.    public YtsType classType() default YtsType.util;  
  8. }  
  9.    
  1. @Documented  
  2. @Retention(RetentionPolicy.RUNTIME)  
  3. @Target(ElementType.METHOD)  
  4. @Inherited  
  5. public @interface HelloWorld {  
  6.     public String name()default "";  
  7. }  

@Retention(RetentionPolicy.RUNTIME)

定義的這個註解是註解會在class位元組碼檔案中存在,在執行時可以通過反射獲取到。

@Target({ElementType.TYPE,ElementType.METHOD})

因此這個註解可以是類註解,也可以是方法的註解

這樣一個註解就自定義好了,當然註解裡面的成員可以為基本的資料型別,也可以為資料,Object等等

 

3 註解是定義好了,那麼怎麼來得到,解析註解呢?

java的反射機制可以幫助,得到註解,程式碼如下:

  1. public class ParseAnnotation {  
  2.   
  3.      public void parseMethod(Class clazz) throws IllegalArgumentException, IllegalAccessException, InvocationTargetException, SecurityException, NoSuchMethodException, InstantiationException{  
  4.   Object obj = clazz.getConstructor(new Class[]{}).newInstance(new Object[]{});  
  5.     for(Method method : clazz.getDeclaredMethods()){  
  6.         HelloWorld say = method.getAnnotation(HelloWorld.class);  
  7.         String name = "";  
  8.         if(say != null){  
  9.            name = say.name();  
  10.            method.invoke(obj, name);  
  11.         }  
  12.        Yts yts = (Yts)method.getAnnotation(Yts.class);  
  13.        if(yts != null){  
  14.           if(YtsType.util.equals(yts.classType())){  
  15.           System.out.println("this is a util method");  
  16.         }else{  
  17.             System.out.println("this is a other method");  
  18.             }  
  19.         }  
  20.       }  
  21.     }  
  22.     @SuppressWarnings("unchecked")  
  23.     public void parseType(Class clazz) throws IllegalArgumentException, IllegalAccessException, InvocationTargetException{  
  24.         Yts yts = (Yts) clazz.getAnnotation(Yts.class);  
  25.         if(yts != null){  
  26.             if(YtsType.util.equals(yts.classType())){  
  27.                 System.out.println("this is a util class");  
  28.             }else{  
  29.                 System.out.println("this is a other class");  
  30.             }  
  31.         }  
  32.     }  
  33.       
  34. }  

前一個方法是解析得到方法註解的,後一個方法是得到類註解的

以下是測試方法類

  1. @Yts(classType =YtsType.util)  
  2. public class SayHell {  
  3.   
  4.     @HelloWorld(name = " 小明 ")  
  5.     @Yts  
  6.     public void sayHello(String name){  
  7.         if(name == null || name.equals("")){  
  8.             System.out.println("hello world!");  
  9.         }else{  
  10.             System.out.println(name + "say hello world!");  
  11.         }  
  12.     }  
  13. }  

 

    1. public static void main(String[] args) throws IllegalArgumentException, IllegalAccessException, InvocationTargetException, SecurityException, NoSuchMethodException, InstantiationException {  
    2.         ParseAnnotation parse = new ParseAnnotation();  
    3.         parse.parseMethod(SayHell.class);  
    4.         parse.parseType(SayHell.class);  
    5.     } 

相關文章