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:子類が親類の注釈を引き継ぐことを許可する時、プログラマは主に自分の注釈を定義し、自分のプロセッサを作ってそれらを処理します.
注解プロセッサを作成して使用します.Java SE 5は反射機構のAPIを拡張して、プログラマがこのようなツールを構築するのを助けます.
外部ツールのaptを提供して、注釈付きJavaソースコードを解析します.以下は非常に簡単な注釈プロセッサです.私たちはこれを使ってPasswodUtils類を読みます.そして反射メカニズムを使って調べます.
@UseCaseマークを探しています.私たちはIDのセットを提供しています.そして、PasswordUtilsで見つけた用例と欠落したものを並べます.
用例.
AnnotatedElementインターフェース(class,Method,Fieldなどのクラスでこのインターフェースを実現しました).get Annotation()メソッドは指定されたクラスに戻ります.
型の注釈対象はここでUseCaseです.注釈された方法にこのタイプの注釈がないとnull値に戻ります.
ID()とdescription()を呼び出します.戻りUseCaseオブジェクトから要素の値を抽出します.ここでencryptPassword()メソッドは注
解の時はdescriptionの値が指定されていませんので、プロセッサはそれに対応する注釈を処理する時、description()の方法で取得します.
は、デフォルト値のdescriptionです.
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:子類が親類の注釈を引き継ぐことを許可する時、プログラマは主に自分の注釈を定義し、自分のプロセッサを作ってそれらを処理します.
- ----------------------------- UseCase.java -------------------------
- package com;
-
- import java.lang.annotation.ElementType;
- import java.lang.annotation.Retention;
- import java.lang.annotation.RetentionPolicy;
- import java.lang.annotation.Target;
-
- @Target(ElementType.METHOD)// ,
- // , (source) (class) (runtime)
- @Retention(RetentionPolicy.RUNTIME)
- public @interface UseCase {
- public int id();
- public String description()default "no description";
- }
-
- ----------------------------- PasswordUtils .java -------------------------
- package com;
-
- public class PasswordUtils {
- @UseCase(id=47,description="Passwords must contain at least one numeric")
- public boolean validatePassword(){
- return true;
- }
-
- @UseCase(id=48)
- public String encryptPassword(String password){
- return password;
- }
-
- @UseCase(id=49,description="Jong_Cai")
- public void showName(){
- System.out.println("Jong_Cai");
- }
- }
1−2:注釈を作成するプロセッサは、注釈を読み取るためのツールがなければ、注釈よりも注釈が役に立ちません.注釈を使用する過程で、重要な部分です.注解プロセッサを作成して使用します.Java SE 5は反射機構のAPIを拡張して、プログラマがこのようなツールを構築するのを助けます.
外部ツールのaptを提供して、注釈付きJavaソースコードを解析します.以下は非常に簡単な注釈プロセッサです.私たちはこれを使ってPasswodUtils類を読みます.そして反射メカニズムを使って調べます.
@UseCaseマークを探しています.私たちはIDのセットを提供しています.そして、PasswordUtilsで見つけた用例と欠落したものを並べます.
用例.
- ------------------------ UseCaseTracker.java ---------------------------
- package com;
-
- import java.lang.reflect.Method;
- import java.util.ArrayList;
- import java.util.Collections;
- import java.util.List;
-
- public class UseCaseTracker {
- public static void trackUseCases(List<Integer> list, Class<?> cl) {
- for (Method m : cl.getDeclaredMethods()) {
- UseCase us = m.getAnnotation(UseCase.class);
- if (us != null) {
- System.out.println("Found Use Case:" + us.id() + " "
- + us.description());
- list.remove(new Integer(us.id()));
- }
- }
- for (int i : list) {
- System.out.println("Warning:Missing use case-" + i);
- }
- }
-
- public static void main(String[] args) {
- List<Integer> list = new ArrayList<Integer>();
- Collections.addAll(list, 47,48,49,50,51);
- trackUseCases(list, PasswordUtils.class);
- }
- }
このプログラムは2つの反射方法を使用しています.get DeclardMethods()とget Annotation()はどちらですか?AnnotatedElementインターフェース(class,Method,Fieldなどのクラスでこのインターフェースを実現しました).get Annotation()メソッドは指定されたクラスに戻ります.
型の注釈対象はここでUseCaseです.注釈された方法にこのタイプの注釈がないとnull値に戻ります.
ID()とdescription()を呼び出します.戻りUseCaseオブジェクトから要素の値を抽出します.ここでencryptPassword()メソッドは注
解の時はdescriptionの値が指定されていませんので、プロセッサはそれに対応する注釈を処理する時、description()の方法で取得します.
は、デフォルト値のdescriptionです.