コメント
アノテーションは、以下の分野での注釈の主な役割を手順を説明するために使用され、JDK1.5後に表示される新機能です。
- 例えばコンパイルチェック、@Override
- ドキュメントを書くことは、Javaのドキュメントは、ノートに応じて対応する文書を生成します。
- [反射を使用して]、コード分析、コメントによるコード解析
以下のような組み込みの注釈いくつかの共通のJDKは、があります。
- オーバーライド:注釈は書き換えの親クラスであるかどうかを変更する方法を確認してください
- Deprecatedd:注釈のコンテンツは時代遅れマークされています
- SuppressWarnning:警告を抑制し、引数はすべて、すべての警告を抑制表し合格しました
カスタム注釈
内蔵のJDKノートの数が多いが、しかし、プログラムの準備は、注釈の広範な使用上のいくつかのフレームワークとして、大きな利便性をもたらしたように、それはまた、注釈をカスタマイズすることを可能にします。
Javaのアノテーションは、基本的に継承されているjava.lang.annotation.Annotation
インターフェイスのインターフェイスがありますが、単純にキーワードを使用する場合はinterface
、まだコメントしていない、インターフェイスを定義するためのアノテーションを定義するとき、単に一般的なインタフェースは、キーワードを使用する必要があり@interface
、キーワードはデフォルト設定されます継承されたAnnotation
インターフェイスを、コメントとしてインターフェイスを定義
注釈は、基本的なタイプ、文字列、列挙型、注釈、及びこれらのタイプのアレイ、我々はプロパティと呼ばれるこれらのメソッドを呼び出すとすることができ、これらのメソッドの値を返すメソッドを定義することができます。
注釈を使用するときは次のことに注意すること
- デフォルトの割り当ては、デフォルト値を設定することができます使用していない場合は、プロパティの割り当てのメモを与える必要があります
- プロパティリストは、1つの属性のみ値を命名する場合は、割り当て時にプロパティの名前を指定することはできません
- カンマで区切られた複数の属性値を使用して
- 配列値プロパティを使用して、
{}
唯一の配列プロパティの値は、ときには、{}
省略することができます
元のメモ
元のノートは、Javaのメタデータアノテーションは、以下のいくつかを提供し、注釈の注釈を記述するために使用されています
ターゲット
注釈は、ソースコードにコメントを使用することができる、すなわちJavaコード要素を説明した位置に作用することができる以下の通りであります:
@Documented
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.ANNOTATION_TYPE)
public @interface Target {
ElementType[] value();
}
このアノテーションは、1つの属性のみ値である、属性が配列ののElementType列挙型を渡す必要があり、以下の列挙型は、いくつかの値を取ることができます
ElementType | 意味 |
---|---|
タイプ | 列挙型を使用して(コメントを含む)インタフェース、クラス、 |
フィールド | (列挙定数を含む)フィールド宣言 |
方法 | 方法 |
PARAMETER | パラメータ宣言 |
コンストラクタ | コンストラクタ |
LOCAL_VARIABLE | ローカル変数宣言 |
ANNOTATION_TYPE | 注釈型宣言 |
パッケージ | パッケージ宣言 |
保持
三つの主要な段階があり、保持されたノートの注釈タイプの長さを示す:ソースステージ、クラスオブジェクトフェーズ、動作フェーズは、ソース相は、ソースコードのみに存在し、クラスオブジェクトステージ手段は、.classファイルにコンパイルされクラスオブジェクトは、実装段階を指し、メモリにロードされる。デフォルトの保持ポリシーRetentionPolicy.CLASS。
次のようにそのソースコードは次のとおりです。
@Documented
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.ANNOTATION_TYPE)
public @interface Retention {
RetentionPolicy value();
}
文書化
それは注釈要素は、javadocツールなどのツールで文書化することができたことを表しています。ソースは以下のとおりです。
@Documented
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.ANNOTATION_TYPE)
public @interface Documented {
}
継承されました
これは注釈型が自動的に継承されていることを示し
@Documented
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.ANNOTATION_TYPE)
public @interface Inherited {
}
読ん内蔵ノート
JDKの使用に関連するいくつかの注意事項を説明するために、組み込み注釈付きの次の解釈
オーバーライド
@Target(ElementType.METHOD)
@Retention(RetentionPolicy.SOURCE)
public @interface Override {
}
注釈をコンパイルするかどうかをチェックするには、注釈の注釈は、親クラスを書き換える方法であるかどうか。
ビューのソース点から、それが唯一の方法で使用することができ、それが唯一のソースステージに存在するの.classファイルにコンパイルされません
Deprecatedd
@Documented
@Retention(RetentionPolicy.RUNTIME)
@Target(value={CONSTRUCTOR, FIELD, LOCAL_VARIABLE, METHOD, PACKAGE, PARAMETER, TYPE})
public @interface Deprecated {
}
コンパイラ、プログラム要素(例えばなど、クラス、メソッド、プロパティなど)を通知するために使用は推奨されません
ビューのソースポイントからは、ほとんどすべてのJavaプログラム要素のは、それを使用することができ、かつメモリにロードされます
SuppressWarnning
@Target({TYPE, FIELD, METHOD, PARAMETER, CONSTRUCTOR, LOCAL_VARIABLE})
@Retention(RetentionPolicy.SOURCE)
public @interface SuppressWarnings {
String[] value();
}
警告の特定の種類を無視するようコンパイラーに指示します。
次のように文字列の配列を渡す必要があり、値は以下のとおりです。
|パラメータ|意味|
--- |:|:| ---
時代遅れのクラスやメソッドを使用して| |廃止警告|
|未確認|実行未確認変換警告|
|スイッチブロックはブレークが警告なしに次のケースに入る| |フォールスルー
クラスパスで、ソースファイルのパスなどパスがない存在| |パス警告|
|シリアル|警告クラスのシーケンスを定義することができるserialVersionUIDの欠落している|
|最後に|警告finally節が正常に完了することができません|
| |全ての警告上記のすべての例|
プログラムではコメントを解析し、
一般反射技術によって注釈を識別することが、反射技術によってカスタム注釈を解析することは前提注釈範囲ランタイムのメモリにそれを作るためにロードされます。
JDKは、私たちの使用を容易にするために、次のような共通のAPIを提供
する方法| |の戻り値|通訳|
---- |:|:----- |:| ---
その要素がある場合| | T | getAnnotation(クラスannotationClass)注釈のタイプを指定し、対応するアノテーションはnullを返すそうでなければ、それを返す|
|注釈[] | getAnnotationsは()| |この要素に存在するすべての注釈を返し
|注釈[] | getDeclaredAnnotationsを()|この要素上に直接存在するすべての注釈を返します。|
|ブール| isAnnotationPresent(クラスannotationClass <拡張注釈?>)|要素の注釈存在のタイプを指定する場合、それはそうでない場合はfalseを返し、trueを返します|
リアル
完全なカスタム注釈やプログラムでの注釈の使用例を説明するために、次の例を使用して、今、MyTestにJUnitの注釈を模倣するために定義されている限り、今後の修正方法を自動的に実行されるようにすることを指摘しています
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
import java.lang.annotation.ElementType;
@Target({ElementType.METHOD})
@Retention(RetentionPolicy.RUNTIME)
public @interface MyTest {
}
ノートを変更するためのターゲット〜第変更これで注釈付きの実装にコメント、フォローアップを定義するすべての方法方法しか保持を変更することで使用することができますを示しているノートを実行するように保持されますマーク
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
public class Test {
@MyTest
public void test1(){
System.out.println("this is test1");
}
@MyTest
public void test2(){
System.out.println("this is test2");
}
public static void main(String[] args) {
Method[] methods = Test.class.getMethods();
for (Method method:methods){
if (method.isAnnotationPresent(MyTest.class)){
try {
method.invoke(new Test());
} catch (IllegalAccessException e) {
e.printStackTrace();
} catch (InvocationTargetException e) {
e.printStackTrace();
}
}
}
}
}
我々は2つのテスト機能は、テストクラスで使用される定義する@MyTest
第一反射法によって得られたクラスの全てが、その後のメソッドを呼び出し、メイン処理では、変形isAnnotationPresent
関数がメソッドであるか否かを判断する@Test
修飾、およびもしそうであれば、方法を実行します。でも、この後に限り、メソッドを追加@MyTest
変更が呼び出されます。
JUnitフレームワーク
本質的な部分であるソフトウェアユニットテストの品質を確保するために、ソフトウェア開発では、Javaは、ユニットテストのためのJUnitテストフレームワークを提供します
通常、各クラスに対応するJavaプログラムは、例えば、Personクラスは、PersonクラスをテストするためにPersonTestをテストするためのクラスを定義し、ユニットテストのために使用されるすべてのコードのテストクラスであろう
JUnitのは、私たちはユニットテストを書くためのノートの数で定義されています
- @Test:注釈メソッドを変更した試験方法は、試験方法であります
- @Before:試験方法が実行される前に、この注釈は修正方法を行います
- @After:試験方法が実行された後に、この注釈は修正された方法を実行します
JUnitの注釈に加えて、いくつかの一般的に使用される、テストアサーションを自動化する機能の数を定義し、以下の通りであります:
- 空のassertEquals(ブール値が期待、実際の真偽値):二つの変数やバランス方程式かどうかをチェックします
- 空いるassertTrue(boolean型が期待される、実際のブール):条件を確認してくださいは真であります
- assertFalse(ブール条件)を無効:チェック条件が偽
- assertNotNull(Objectオブジェクト)を無効:検査中のオブジェクトは空ではありません
- 空assertNull(Objectオブジェクト):検査オブジェクトがnullであります
- ボイドassertSame(ブール条件):assertSame()メソッドは、2つの関連するオブジェクトが同じオブジェクトを指して確認します
- ボイドassertNotSame(ブール条件):assertNotSame()メソッドをチェックする二つの関連するオブジェクトが同じオブジェクトを指しているか否か
- ボイドassertArrayEquals(expectedArray、resultArray):assertArrayEquals()メソッドをチェック二つの配列が等しいかどうか
アサーション後のこれらの機能は、テストに合格することができない異常を確認するためにフォローアップする限り、例外がスローされます失敗します
算術2つの数値を実行するクラスの計算を定義すると
public class Calc {
public int add(int a, int b){
return a + b;
}
public int sub(int a, int b){
return a - b;
}
public int mul(int a, int b){
return a * b;
}
public float div(int a, int b){
return a / b;
}
}
これらのメソッドが正しいテストするために、我々は、テストクラスを定義します
import org.junit.Test;
import static org.junit.Assert.assertEquals;
public class CalcTest {
@Test
public void addTest(){
int result = new Calc().add(1,2);
assertEquals(result, 3);
}
@Test
public void subTest(){
int result = new Calc().sub(1,2);
assertEquals(result, -1);
}
@Test
public void mulTest(){
int result = new Calc().mul(1,2);
assertEquals(result, 2);
}
@Test
public void divTest(){
float result = new Calc().div(1,2);
assertEquals(result, 0.5, 0.001); //会报异常
}
}
テストの最後に見つかったdivTest法が異常に報告された後、我々が使用しているため、実際の値は、0であり、/
得られた2つの整数を計算するためにのみ予約ビット整数を期待0.5と一致しないので、異常が報告され、0であります