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
?
1
@Copyright
(value =
"All Rights Resvered"
)
2
public
class
Book
3
...
宣言がおかしいだけでなく、@Targetと@Retentionの2行のよく知らないコードもあります.この2つ自体がJavaが提供するタグで、私たちのタグクラスCopyrightのいくつかの属性を定義しています.以下、詳細に説明する.
@Targetは、このタグの役割ドメインを指定します.全部で4種類あります.
役割ドメインとは何ですか?簡単です.このタグクラスがコードのどのようなタイプの要素に使用できるかを指します.@Deprescatedという比較的よく使われるJava固有タグを例に挙げると、クラスを期限切れとしてマークすることができます.
view source
?
1
@Deprecated
2
public
class
SomeClazz {...}
関数を期限切れとしてマークすることもできます.
view source
?
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タグは、作成したタグのライフサイクルを指定する役割を果たします.
一部のタグはコードロジックに関与せず、コンパイラの警告出力を抑制する@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 。 ,