Web開発チュートリアル2-Java Annotation



この文章では、Java Annotationというもう一つの非常に重要な予備知識を学びます.Java Annotationは、Sun社がJDK 1.5以降発表した新しい言語特性で、中国語でJavaタグに翻訳できます.タグプロパティとは?Javaを使用してプログラムを作成した場合は、この機能に触れたことがあるかもしれません.たとえばJavaDoc構文で使用される@return,@paramはJavaタグです.たとえば、Javaコンパイラの警告情報を抑制するためによく使用される@SuppressWarningタグと、メソッドや期限切れの@Deprescatedタグを識別します.Java 1.5バージョンから、ユーザーは自分でいろいろなタグを作ることができます.
タグを使うメリットは何ですか?最大の利点は、この特性がコード間の結合度を非常に低くすることである.では、Annotationはどのように作成し、どのように使用しますか?次は自分で自分のAnnotationを作ってみましょう.
≪インスタンス|Instance|emdw≫
図書データ管理のプロジェクトをします.このプロジェクトでは、図書類Bookがあり、どの本にも自分の本名book nameがあります.タイトルの他にも、添付の著作権情報Copyrightがありますが、デザインの観点から著作権という属性は出版社が定義しており、本自体とはあまり関係がないので、Bookの属性情報を作りたくありません.そこでCopyrightを独立してクラスに設計し,Bookクラスに埋め込む.従来の方法を使用すると、CopyrightクラスはBookのプライベートメンバーになります.1 public class Book { 2 ... 3 private Copyright copyright; 4 ... 5 }
しかし、ここでは、新しいAnnotation特性を使用して、CopyrightをBookのタグにする別の実装方法を使用します.まず最初にしなければならない仕事はCopyrightというタグクラスを作ることです.
 
 import java.lang.annotation.ElementType;  

 import java.lang.annotation.Retention;  

 import java.lang.annotation.RetentionPolicy;  

 import java.lang.annotation.Target;  

   

 @Target(ElementType.TYPE)  

 @Retention(RetentionPolicy.RUNTIME)  

 public @interface Copyright {  

     String value();  

 } 

 
 
この中には未接触の文法がたくさんあります.まず、Annotationクラスの定義はJavaインタフェースクラスinterfaceの定義に似ていますが、一般的なインタフェースクラスに比べてinterfaceの前に@が1つ増えています.これでCopyrightはAnnotationクラスであることが宣言されました.また、String value()という書き方は@interfaceの中で比較的ユニークなところです.実際に定義されるのは、タグクラスのメソッドではなく、タグクラスのプロパティです.Bookカテゴリでは、このプロパティをどのように使用しているかがわかります.
view source
print
? 1 @Copyright (value = "All Rights Resvered" ) 2 public class Book 3 ...
宣言がおかしいだけでなく、@Targetと@Retentionの2行のよく知らないコードもあります.この2つ自体がJavaが提供するタグで、私たちのタグクラスCopyrightのいくつかの属性を定義しています.以下、詳細に説明する.
@Targetは、このタグの役割ドメインを指定します.全部で4種類あります.
  • TYPE-Class、Interface、Enum、Annotationの
  • に使用できることを示します.
  • FIELD-クラスに使用可能な属性の上
  • METHOD-関数
  • PARAMETER-関数用パラメータ
  • CONTRUCTOR-構築方法
  • PACKAGE-パケット

  • 役割ドメインとは何ですか?簡単です.このタグクラスがコードのどのようなタイプの要素に使用できるかを指します.@Deprescatedという比較的よく使われるJava固有タグを例に挙げると、クラスを期限切れとしてマークすることができます.
    view source
    print
    ? 1 @Deprecated 2 public class SomeClazz {...}
    関数を期限切れとしてマークすることもできます.
    view source
    print
    ? 1 public class SomeClazz { 2     3 @Deprecated 4 public void someMethod(); 5 ... 6 }
    パラメータ、属性、構築方法などすべての要素を@Deprescatedとマークすることもできます.したがって,@DeprecatedというマーキングドメインはTYPE+FIELD+METHOD+PARAMETER+CONTRUCTOR+PACKAGE,すなわち全域有効であると述べた.私たちが自分で作ったこのCopyrightにとって、その役割ドメインはずっと小さいです.CopyrightがBookにタグを付けることを望んでいるだけで、Bookはクラスであるため、Copyrightの役割ドメインはTYPEであることを指定します.これにより,我々が作成した@CopyrightがTYPE以外の場所に使用されると,コンパイラはエラーを報告する.
    もう1つの@Retentionタグは、作成したタグのライフサイクルを指定する役割を果たします.
  • SOURCE-このタグを表すのは、コードコンパイル前にのみ生存します.たとえば@Deprescatedでは、コンパイル前にいくつかのヒントを提供します.これらのタグは、コンパイル時にclassファイルにコンパイルされません.
  • CLASS-CLASSとは異なり、これらのタグはclassファイルにコンパイルされますが、プログラムの一部にはなりません.また、コードを使用して実行時に呼び出すことはできません.
  • RUNTIME-これらのタグはコードの一部となり、実際の実行時に機能します.CopyrightタグはRUNTIMEタイプです.

  • 一部のタグはコードロジックに関与せず、コンパイラの警告出力を抑制する@SuppressWarningタグなど、コンパイラにメモを書く場所を提供するか、コンパイラのいくつかの動作を制御します.このようなタグには、コードから削除した後も、コードが正しく使用され、実行時の動作に影響を与えないという特徴があります.SOURCEおよびCLASSタイプのタグはこのクラスに属する.タグ自体がコードの一部であり、コードの実行プロセスに参加し、コード内でタグの属性を呼び出します.このようなタグは有無ではなく、コードロジックの構成部分であり、RUNTIMEタイプのタグはこれに属する.私たちのCopyrightタグについては、コード実行中に各本の著作権情報を取得する必要があるため、CopyrightをRUNTIMEタイプとしてマークします.タグ内の著作権データの呼び出しのデモが表示されます.
     
    次に図書のカテゴリを作成します.
     
    @Copyright(value = "All Rights Resvered")  
    
     public class Book {  
    
         private String bookname;  
    
        
    
         public String getBookname() {  
    
             return bookname;  
    
         }  
    
        
    
         public void setBookname(String bookname) {  
    
             this.bookname = bookname;  
    
         }  
    
     } 
    
     
    このJavaクラスは非常に簡単で、あまり説明する必要はありません.特筆すべきは、BookクラスにCopyrightというタグを使用し、BookカテゴリのCopyrightをAll rights reservedと宣言したことです.次にUseBookクラスを作成し、タグが有効かどうかを確認します.
    import java.lang.annotation.Annotation;  
    
        
    
     public class UseBook {  
    
        
    
         public static void main(String[] args) {  
    
             Book b = new Book();  
    
             b.setBookname("J2EE Tutorial");  
    
             for (Annotation anno : b.getClass().getAnnotations()) {  
    
                 System.out.println(anno.annotationType().toString());  
    
                 if (anno.annotationType().equals(Copyright.class)) {  
    
                     Copyright c = (Copyright) anno;  
    
                     System.out.println("The Copyright of " + b.getBookname() + ": " 
    
                             + c.value());  
    
                 }  
    
             }  
    
         }  
    
     } 
    
     
    CopyrightのRetentionカテゴリをRUNTIMEと定義しているので、プログラムの論理ではJavaが提供するClazz.getAnnotations()メソッドでBookのCopyright情報を取得できるはずです.このコードを実行すると、次のようになります.1 interface Copyright 2 The Copyright of J2EE Tutorial: All Rights Resvered.
    @Retentionの機能をさらに説明するために、RetentionPolicy.RUNTIMEとRetentionPolicy.CLASSのタグを1つずつ作成します.そのうちの1つはVersionと呼ばれ、Bookのバージョンをマークしています.もう1つはTempNoteと呼ばれ、一時的なマークの説明に使用されます.
    import java.lang.annotation.ElementType;  
    
     import java.lang.annotation.Retention;  
    
     import java.lang.annotation.RetentionPolicy;  
    
     import java.lang.annotation.Target;  
    
        
    
     @Target(ElementType.TYPE)  
    
     @Retention(RetentionPolicy.CLASS)  
    
     public @interface Version {  
    
         String value();  
    
     } 
    
     import java.lang.annotation.ElementType;  
    
     import java.lang.annotation.Retention;  
    
     import java.lang.annotation.RetentionPolicy;  
    
     import java.lang.annotation.Target;  
    
        
    
     @Target(ElementType.TYPE)  
    
     @Retention(RetentionPolicy.SOURCE)  
    
     public @interface TempNote {  
    
         String value();  
    
     } 
             Book,         :
    
    
     @TempNote("This is just a note and won't compile in to source code.")  
    
     @Version("First Draft")  
    
     @Copyright(value = "All Rights Resvered.")  
    
     public class BookV2 {  
    
         private String bookname;  
    
        
    
         public String getBookname() {  
    
             return bookname;  
    
         }  
    
        
    
         public void setBookname(String bookname) {  
    
             this.bookname = bookname;  
    
         }  
    
     } 
    
        UseBook     Book:
    
     import java.lang.annotation.Annotation;  
    
        
    
     public class UseBookV2 {  
    
        
    
         public static void main(String[] args) {  
    
             BookV2 b = new BookV2();  
    
             b.setBookname("J2EE Tutorial");  
    
             for (Annotation anno : b.getClass().getAnnotations()) {  
    
                 System.out.println(anno.annotationType().toString());  
    
                 if (anno.annotationType().equals(Copyright.class)) {  
    
                     Copyright c = (Copyright) anno;  
    
                     System.out.println("The Copyright of " + b.getBookname() + ": " 
    
                             + c.value());  
    
                 }  
    
             }  
    
         }  
    
     } 
    
          :
    
    1 interface Copyright  
    
    2 The Copyright of J2EE Tutorial: All Rights Resvered. 
    
     
        ,            RUNTIME   Copyright  ,SOURCE   @TempNote CLASS   @Version        ,       。
    
               :   Copyright     Book  ,       Book            Copyright    ?          ,    Copyright All Rights Resevred,    GNU Public License,                     。  ,        Copyright,      ,      ElementType.TYPE   ElementType.FIELD:
    
    01 import java.lang.annotation.ElementType;  
    
    02 import java.lang.annotation.Retention;  
    
    03 import java.lang.annotation.RetentionPolicy;  
    
    04 import java.lang.annotation.Target;  
    
    05    
    
    06 @Target(ElementType.FIELD)  
    
    07 @Retention(RetentionPolicy.RUNTIME)  
    
    08 public @interface CopyrightV2 {  
    
    09     String value();  
    
    10 } 
      ,        Book   。               :
    
    01 import java.lang.annotation.Annotation;  
    
    02 import java.lang.reflect.Field;  
    
    03    
    
    04 public class UseBookV3 {  
    
    05    
    
    06     @CopyrightV2(value = "All Rights Reserved")  
    
    07     private Book book;  
    
    08    
    
    09     @CopyrightV2(value = "GNU Public License")  
    
    10     private Book book2;  
    
    11    
    
    12     public static void main(String[] args) {  
    
    13    
    
    14         UseBookV3 ub = new UseBookV3();  
    
    15    
    
    16         for (Field field : ub.getClass().getDeclaredFields()) {  
    
    17             System.out.println("fields found.");  
    
    18             for (Annotation anno : field.getAnnotations()) {  
    
    19                 System.out.println(anno.annotationType().toString());  
    
    20                 if (anno.annotationType().equals(CopyrightV2.class)) {  
    
    21                     CopyrightV2 c = (CopyrightV2) anno;  
    
    22                     System.out.println("value: " + c.value());  
    
    23                 }  
    
    24             }  
    
    25         }  
    
    26     }  
    
    27 } 
          ,   UseBookV3       Book   :book book2。  CopyrightV2    FIELD            ,       book book2            。       , UseBookV3   ub          ,java   getDeclaredFields()          。     ub     book book2 ,                ,        :
    
    1 fields found.  
    
    2 interface CopyrightV2  
    
    3 value: All Rights Reserved  
    
    4    
    
    5 fields found.  
    
    6 interface CopyrightV2  
    
    7 value: GNU Public License 
      
                ,                  。      ,                ,       OCP            。       ,       Java       。            ,