Java注記学習ノート

14294 ワード

回転元:http://wanqiufeng.blog.51cto.com/409430/458883
一、java注釈とは何か
注釈、その名の通り、注釈とは、ある物事に注釈の説明を追加し、いくつかの情報を保存することであり、これらの情報は後である時間帯に役立つ可能性があります.Java注釈はjava注釈とも呼ばれ、javaはメソッド、クラス、パラメータ、パケット、ドメイン、変数などに基準を追加できるメカニズムを提供しています(つまり、いくつかの情報を添付します).また、その後の期間において、反射によって寸法の情報を抽出して使用する.二、カスタムJava寸法
1注釈をカスタマイズする理由
Javaでは、1.5以降のデフォルトで3つの寸法が組み込まれています.
  • @Override:親を書き換える方法を他の人に伝えるには、方法の上にしか使用できません.
  • @Deprecated:古いAPIを使わないことをお勧めします.コンパイルするときは警告メッセージを生成し、プログラム内のすべての要素に設定することができます.
  • @SuppressWarnings:このタイプは、警告メッセージを一時的に閉じることができます.
  • しかし、この3つの寸法だけでは、私たちが開発したときのニーズを満たすことはできません.だからjavaは注釈をカスタマイズして使用することができます.
    2注釈のカスタマイズ方法
    カスタム・ステップは、大きく分けて2つのステップに分けられます.
  • @interfaceキーワード(interfaceではなく@interaceであることに注意)によって注釈名、および注釈のメンバー属性または注釈と呼ばれるパラメータを宣言します.
  • javaに組み込まれた4つのメタ注釈を使用して、このカスタム寸法の機能と範囲をいくつか制限します.
    問題が来ました.メタ注釈とは何ですか.
    3メタ注記とは
    メタ注釈とは、注釈を定義する注釈であり、すなわち、これらのメタ注釈は、他の注釈を制約するための注釈に特化した役割を果たす.
    上記の3つの注釈を区別してください.彼らもメタ注釈によって定義されています.
    主に4つの@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注釈のカスタマイズおよび使用例
    クラスレベルの寸法Descriptionをカスタマイズ
     1    package lighter.javaeye.com;  2    import java.lang.annotation.Documented;  3    import java.lang.annotation.ElementType;  4    import java.lang.annotation.Retention;  5    import java.lang.annotation.RetentionPolicy;  6    import java.lang.annotation.Target;  7  
    
     8    @Target(ElementType.TYPE)//        
    
     9    @Retention(RetentionPolicy.RUNTIME)//           
    
    10    @Documented//       javadoc 
    
    11    public @interface Description { 12  String value(); 13    }

    メソッドレベルの注記Nameを再定義
     1 package lighter.javaeye.com;  2    import java.lang.annotation.Documented;  3    import java.lang.annotation.ElementType;  4    import java.lang.annotation.Retention;  5    import java.lang.annotation.RetentionPolicy;  6    import java.lang.annotation.Target;  7  
    
     8     //     @Target @Description    ,       
    
     9  @Target(ElementType.METHOD) 10  @Retention(RetentionPolicy.RUNTIME) 11  @Documented 12    public @interface Name { 13  String originate(); 14  String community(); 15    }

    次に、上記の2つの注記を使用します.
     1 package lighter.javaeye.com;  2  
    
     3 @Description(value="javaeye,            ")  4 public class JavaEyer {  5          @Name(originate="   :robbin",community="javaEye")  6          public String getName()  7  {  8                    return null;  9  } 10         
    
    11          @Name(originate="   :    ",community="springside") 12          public String getName2() 13  { 14                    return "     id  ,      ,   !"; 15  } 16 } 17  
    
    18   :    “@Description(value="javaeye,            ")”,    “@Description("javaeye,            ") ”,       。
       Description ( ) value。
       value , 。
       value des, , , :@Description(Des=”xxx”)*/

    注釈の情報を抽出
     1  package lighter.javaeye.com;  2  
    
     3  import java.lang.reflect.Method;  4  import java.util.HashSet;  5  import java.util.Set;  6  
    
     7  public class TestAnnotation {  8          /**
    
     9  * author lighter 10  *   :    Annotation API      javaDoc   11           */
    
    12        public static void main(String[] args) throws Exception { 13        String CLASS_NAME = "lighter.javaeye.com.JavaEyer"; 14        Class test = Class.forName(CLASS_NAME); 15        Method[] method = test.getMethods(); 16        boolean flag = test.isAnnotationPresent(Description.class); 17         if(flag) 18  { 19                  Description des = (Description)test.getAnnotation(Description.class); 20                  System.out.println("  :"+des.value()); 21                  System.out.println("-----------------"); 22  } 23        
    
    24         // JavaEyer       @Name        Set  
    
    25         Set<Method> set = new HashSet<Method>(); 26         for(int i=0;i<method.length;i++) 27  { 28                  boolean otherFlag = method[i].isAnnotationPresent(Name.class); 29                  if(otherFlag) set.add(method[i]); 30  } 31         for(Method m: set) 32  { 33                  Name name = m.getAnnotation(Name.class); 34  System.out.println(name.originate()); 35                  System.out.println("     :"+name.community()); 36  } 37  } 38 }

    注意事項:
        すべての
    Annotation
    自動的に継承されます
    java.lang.annotation
    このインタフェース
    ,
    他のクラスやインタフェースを継承することはできません
    .
         
    最も重要な点
    ,Annotation
    タイプ内のパラメータはどのように設定しますか?
    :
         
    第一
    ,
    使うしかない
    public
    またはデフォルト
    (default)
    この2つのアクセス修飾
    .
    たとえば
    ,String value();
    ここでは方法を
    defaul
    デフォルトのタイプ
    .
         
    2番目
    ,
    パラメータ・メンバーは基本タイプのみ使用できます
    byte,short,char,int,long,float,double,boolean
    8つの基本データ型と
    String,Enum,Class,annotations
    等データ型
    ,
        これらのタイプの配列も
    .
    たとえば
    ,String value();
    ここのパラメータメンバーは
    String.
    参考資料: 
    http://www.javaeye.com/topic/36659 #
                   
    http://www.javaeye.com/topic/400085