Java基礎-学習はAnnotationを使って対象を注釈します.


ヒント:注釈(メタとも呼ばれる)は、コードに情報を追加するための形式的な方法を提供しています.これらのデータを後でいつか非常に便利に使うことができます.
Java基礎-Annotation注解対象注解(メタデータとも呼ばれる)を使ってコードに情報を追加する形式化の方法を学習して、後である
これらのデータを1-1:基本文法Java SE 5に標準注釈@Overrideを内蔵しています.現在の方法定義がスーパークラスに上書きされることを表しています.スペルミスやサインが正しくないと上書きされません.
カバーの方法は、コンパイラがエラーメッセージを送信します.
@Deprecated:プログラマが注釈をその要素として使用すると、コンパイラは警告メッセージを発します.
@Supperess Warnings:不正なコンパイラ警告情報をクローズします.
Java SE 5には4種類のメタ注釈@Targetが内蔵されています.この注釈はどこに使用できるかを示しています.可能なElementTypeパラメータは、1)CONSTRUCTOR:コンストラクタの声明2)FIELD:ドメイン宣言(enum例を含む)3)LOCAL_を含みます.VRIABLE:局所変数声明4)METHOD:方法声明5)PACKAGE:包声明6)PAAMETER:パラメータ宣言7)TYPE:類、インターフェース(注解タイプを含む)またはenum声明
@Retention:どのレベルでこの注釈情報を保存する必要があるかを示します.オプションのRetensPolicyパラメータは、1)SOURCE:注釈はコンパイラによって破棄されます.2)CLASS:注釈はclassファイルで利用できますが、VMによって破棄されます.RUNTIME:VMは運転中にも注釈を保持します.反射機構で注釈の情報を読み取ることができます.
@Dcumented:この注釈をJavadocに含める
@Inherited:子類が親類の注釈を引き継ぐことを許可する時、プログラマは主に自分の注釈を定義し、自分のプロセッサを作ってそれらを処理します.

  
  
  
  
  1. ----------------------------- UseCase.java -------------------------      
  2. package com;      
  3.      
  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. // , (source) (class) (runtime)      
  11. @Retention(RetentionPolicy.RUNTIME)      
  12. public @interface UseCase {      
  13.  public int id();      
  14.  public String description()default "no description";      
  15. }      
  16.      
  17. ----------------------------- PasswordUtils .java -------------------------      
  18. package com;      
  19.      
  20. public class PasswordUtils {      
  21.  @UseCase(id=47,description="Passwords must contain at least one numeric")      
  22.  public boolean validatePassword(){      
  23.   return true;      
  24.  }      
  25.        
  26.  @UseCase(id=48)      
  27.  public String encryptPassword(String password){      
  28.   return  password;      
  29.  }      
  30.        
  31.  @UseCase(id=49,description="Jong_Cai")      
  32.  public void showName(){      
  33.   System.out.println("Jong_Cai");      
  34.  }      
  35. }     
1−2:注釈を作成するプロセッサは、注釈を読み取るためのツールがなければ、注釈よりも注釈が役に立ちません.注釈を使用する過程で、重要な部分です.
注解プロセッサを作成して使用します.Java SE 5は反射機構のAPIを拡張して、プログラマがこのようなツールを構築するのを助けます.
外部ツールのaptを提供して、注釈付きJavaソースコードを解析します.以下は非常に簡単な注釈プロセッサです.私たちはこれを使ってPasswodUtils類を読みます.そして反射メカニズムを使って調べます.
@UseCaseマークを探しています.私たちはIDのセットを提供しています.そして、PasswordUtilsで見つけた用例と欠落したものを並べます.
用例.

  
  
  
  
  1. ------------------------ UseCaseTracker.java ---------------------------      
  2. package com;      
  3.      
  4. import java.lang.reflect.Method;      
  5. import java.util.ArrayList;      
  6. import java.util.Collections;      
  7. import java.util.List;      
  8.      
  9. public class UseCaseTracker {      
  10.  public static void trackUseCases(List<Integer> list, Class<?> cl) {      
  11.   for (Method m : cl.getDeclaredMethods()) {      
  12.    UseCase us = m.getAnnotation(UseCase.class);      
  13.    if (us != null) {      
  14.     System.out.println("Found Use Case:" + us.id() + " "     
  15.       + us.description());      
  16.     list.remove(new Integer(us.id()));      
  17.    }      
  18.   }      
  19.   for (int i : list) {      
  20.    System.out.println("Warning:Missing use case-" + i);      
  21.   }      
  22.  }      
  23.      
  24.  public static void main(String[] args) {      
  25.   List<Integer> list = new ArrayList<Integer>();      
  26.   Collections.addAll(list, 47,48,49,50,51);      
  27.   trackUseCases(list, PasswordUtils.class);      
  28.  }      
  29. }     
このプログラムは2つの反射方法を使用しています.get DeclardMethods()とget Annotation()はどちらですか?
AnnotatedElementインターフェース(class,Method,Fieldなどのクラスでこのインターフェースを実現しました).get Annotation()メソッドは指定されたクラスに戻ります.
型の注釈対象はここでUseCaseです.注釈された方法にこのタイプの注釈がないとnull値に戻ります.
ID()とdescription()を呼び出します.戻りUseCaseオブジェクトから要素の値を抽出します.ここでencryptPassword()メソッドは注
解の時はdescriptionの値が指定されていませんので、プロセッサはそれに対応する注釈を処理する時、description()の方法で取得します.
は、デフォルト値のdescriptionです.