アノテーションフィーチャの打ち上げは、多くの人々の注目を集める一方、2005年には、太陽がコードに注釈を使用して、JDK1.5を立ち上げ、Javaプログラマは、面倒な設定の苦しみを軽減することができます。
、バグ少ないコードを維持するために簡単に書くことができます注釈を使用してください。
それは何のコメントですか?公式声明によると、メタタグは、あなたのコードに追加し、宣言、型宣言、コンストラクタ、メソッド、フィールド、パラメータや変数をパッケージ化するために適用できることを指摘しています。
ノートは、彼らがそうで、他のクラスを参照するクラスを記述し、するかどうか、完了しているかどうか、他の方法に依存しているあなたが書く方法かどうかを示すための非常に便利な方法を提供します。
Javaコードのテンプレートコードで書かれたノートに基づいてOracleの公式声明によると、ソースコードのコメントに基づいて生成されたので、私たちは、ほとんどの場合、定型的なコードを書くことを回避されます。これは、このスタイルでは、プログラマが何をすべきかと言う、ユーティリティはそれを実装するための適切なコードを書きます、宣言型プログラミングスタイルにつながります。
簡潔には、注釈は、プログラム要素に関連付けられたメタタグの機構であり、仮想マシンのコンパイラを許可または注釈プログラムの動作要素から抽出し、そして必要な場合、コード相互依存を生成します。
今私達のJavaアノテーションのための旅を学びます。
内蔵のノートの
Javaは、あなたが直接使用することができ、そのうちのいくつかは良いノートを達成している建設される組み込みの注釈主にJavaコンパイラディレクティブを提供するために使用されます。
5内蔵のJavaアノテーションがあります。
- @Deprecated
- @オーバーライド
- @SuppressWarnings
- @SafeVarargs
- @FunctionalInterface
@Deprecated注釈は主にクラスのために使用され、方法は、ラベルの付いた変数は、あなたは、クラス、メソッド、変数の使用を推奨していませんコードを使用する場合、コンパイラはあなたに警告を与える、使用することをお勧めしません。
使用されている次の例では、@Deprecated:
public class AnnotationTest {
public static void main(String args[]){
MyAnnotation myAnnotation = new MyAnnotation();
int age = myAnnotation.age;
myAnnotation.eat();
}
}
@Deprecated
class MyAnnotation {
@Deprecated
int age;
@Deprecated
void eat(){
}
}
MyAnnotationを定義し、コメントを@Deprecatedクラス名、変数やメソッド名に使用されています。
識別@Deprecatedクラス、メソッド、または変数を使用する場合、
推奨されないのはなぜ、Javadocは、ドキュメントクラス、メソッドや変数に別の使用が記載されている@deprecated、および代替方法が与えられます。
@Deprecated
/**
@deprecated 已废弃,请使用MyNewComponent.
*/
class MyComponent {
}
@Override使用方法についての注釈は、親クラスのアイデンティティは、このメソッドをオーバーライドします。この方法は、一貫性のない、と親クラスのメソッドである場合、コンパイラはエラーを表示します。
強くノートを書き換え@Overrideも効果はありません、親クラスのメソッドを使用することが推奨されていますが、誰かが親クラスのメソッドを変更したときにコメント@Override使用しない場合は、サブカテゴリの方法かどうかを識別することができません親クラスを書き換えます。@Overrideノートの使用は、限り、親がこの方法を持っていないと、コンパイラはエラーが親クラスのメソッドに対応していないプロンプトが表示されます。
ここで@Overrideアノテーションを使用した例です。
class Anaimal{
public void run(){
}
}
class Cat extends Anaimal{
@Override
public void run(){
}
}
Catクラスメソッドの代わりにRUN1()、コンパイラが表示されます場合は実行Catクラス()メソッドは、@Overrideノートを使用してThe method run1() of type Cat must override or implement a supertype
、エラーを。
いいえ@Override注釈、(Catクラスをrunlする方法)場合、システムは、与えられていません。
@SuppressWarningsノートは推奨されないメソッド呼び出しの警告を抑制するためか、危険な変換の種類別の方法でもあり、コンパイラは、いくつかの警告を発行します、あなたはこれらの警告を無視することができ@SuppressWarningsを使用しています。
使用例:
@SuppressWarnings
public void methodWithWarning() {
}
@SafeVarargs注釈は主に抑制パラメータの型の安全性の警告のために使用され、これはjdk1.7の新機能です。
使用例:
@SafeVarargs
static void testSafeVarargs(List<String> ... stringLists) {
Object[] array = stringLists;
List<Integer> tmpList = Arrays.asList(42);
array[0] = tmpList;
String s = stringLists[0].get(0);
}
あなたが@SafeVarargsアノテーションを使用しない場合、コンパイラは警告を与えます:Type safety: Potential heap pollution via varargs parameter stringLists
。
使用@SafeVarargs前提はあなたがジェネリッククラスを使用する場合、可変長パラメータ法の使用は、セキュリティ上の問題の種類が発生しないことを確認する必要があり、そこにあります。それ以外の場合は、行を実行すると、ClassCastExceptionがスローされます。
唯一の方法で注釈を@SafeVarargs、以下の条件を満たしています:
- 可変長方式またはコンストラクタパラメータ。
- この方法は、静的またはfinalとして宣言する必要があります。
@FunctionalInterfaceの注釈は主にあなたが機能インタフェースの定義を満たしていないインタフェースを記述する場合、コンパイラは文句を言うだろう、コメントで、エラーチェックのレベルをコンパイルするために使用されます。
使用例:
@FunctionalInterface
interface GreetingService
{
void readMessage(String message);
}
ノートの作成
注釈を、やや似たインターフェイスを作成、言葉の習慣が、あなたがコメントを作成するとき、あなたはインターフェイスの前に@文字を追加する必要があることを除いて、インタフェースを押収を使用しています。
ここにコメントを作成する例を示します。
public @interface MyAnnotation {
}
トップノートを作成すると、任意のメンバ変数を持っていません。
メンバ変数でノートを作成します。
@interface TestAnnotation{
int age();
String name();
}
TestAnnotationアノテーションは2つのメンバ変数、年齢と名前が付いています。
ノンパラメトリックな方法で注釈を付けメンバ変数宣言ない方法ボディフォーム。
デフォルトのキーワードはデフォルト値注釈メンバ変数を指定し使用します。
@interface TestAnnotation{
int age() default 2;
String name() default “小明”;
}
変数にデフォルト値がある場合は、カスタム注釈、注釈を使用するときは、メンバ変数、デフォルト値を直接使用するための値を指定することはできません。
使用例:
@interface TestAnnotation{
int age() default 2;
String name() default "小明";
}
class MyAnnotation {
@TestAnnotation
public void getInfo(){
}
}
変数コメントなしデフォルトでは、すべての使用中の各変数に値を指定する必要がある場合は、次のように、コードは次のとおりです。
@interface TestAnnotation{
int age();
String name();
}
class MyAnnotation {
@TestAnnotation(age=2,name="小明")
public void getInfo(){
}
}
メタアノテーションは
、アノテーションの元、それは何ですか?注釈は、注釈は、注釈を定義するために使用される、注釈メタデータアノテーションであり、注釈は、基本データ型として理解することができます。このようなものは、発音、またはより快適なコードを見て、本当に難しいです。
@Target(ElementType.METHOD)
@interface Test_Target {
public String doTestTarget();
}
@Targetメタ注釈はTest_Targetコメントを定義するために使用されます。
Javaは、5元のノートを提供しています:
- 注釈のライフサイクル、すなわち生存時間を指定@Retention。
- 生成されたドキュメント@Documented javadocコマンドは、コメントの内容を反映します
- @targetは、クラス、メソッド、変数として、使用することができるアノテーション要素を指定し、
- @Inherited継承注釈、
- ノート@Repeatable再利用可能
@Retentionは、ライフサイクル、すなわち生存期間の注釈を指定するために使用されます。@Retentionの値でなければならない次の3つの値、使用中@Retentionを提供します。
- 生成されたクラスファイルコンパイラをコンパイルするときRetentionPolicy.SOURCEコメントは破棄され、元のステージに残り、注釈情報は、反射を介して取得することはできません。
- RetentionPolicy.CLASSノートは、それがJVMにロードされないとき、注釈情報がデフォルトである、反射することによって得ることができないコンパイルされるように保持されます。
- プログラムが実行されている場合RetentionPolicy.RUNTIME注釈を保持することができ、それはJVMにロードされます、あなたが実行されている反射プログラムを介してそれらを得ることができます。
ここでは、カスタム注釈@Retention定義の例です。
@Retention(RetentionPolicy.RUNTIME)
@interface Test_Retention{
}
@Test_Retention
class MyAnnotation {
public void getInfo(){
}
}
上記のコードはTest_Retention注釈を作成し、アノテーションは、ランタイム注釈情報でMyAnnotationを反射することによって取得することができるように改変MyAnnotation使用@Test_Retention、Test_Retentionプログラム実行(RetentionPolicy.RUNTIME)を指定する@Retentionを保持するために使用することができます。
@DocumentedクラスAが@Documentedの元のノートを使用して注釈を指摘する場合、対応する注釈情報が含まれていますjavadocは、生成されたクラスのドキュメントを使用しています。
使用例:
@Documented
@interface TestDocument{
String doTestDocument();
}
@TestDocument (doTestDocument="保留注解信息测试")
class MyAnnotation {
public void getInfo(){
}
}
@targetがオブジェクトに修飾注釈の範囲を指定し、それは引数、パラメータ、方法、および他のパッケージ情報のために使用することができます。
@Targetメタアノテーションは、以下の8つの値を提供します。
- アノテーションの種類を記述するために使用されるElementType.ANNOTATION_TYPE
- 注釈のための構築方法ElementType.CONSTRUCTOR
- 変数コメントElementType.FIELD
- ローカル変数のノートElementType.LOCAL_VARIABLE
- 注釈のためのElementType.METHOD方法
- コメントをElementType.PACKAGEパッケージ
- 注釈のためのElementType.PARAMETERプロセスパラメータ
- クラス、インターフェイス、列挙型のコメントをElementType.TYPE
コード例:
@Target(ElementType.METHOD)
@interface TestMethodTarget{
}
@Target(ElementType.FIELD)
@interface TestFieldTarget{
}
@Target(ElementType.TYPE)
@interface TestTypeTarget{
}
TestMethodTarget注釈クラスの唯一のアノテーション方法、TestFieldTargetのみ注釈クラスメンバ変数に対して、TestTypeTargetは、注釈クラス、(注釈のタイプを含む)インターフェース、または列挙の宣言のために使用することができます
@Inherited指定する注釈を継承することができます。修飾されたノートを使用してクラスを@Inherited、その後ノートクラスのサブクラスを使用します。
コード例:
@Inherited
@interface TestInherited{
}
@Repeatable同じ注釈は複数回使用することができます。例えば、人はそうで趣味の様々な、ランニング、絵画、映画を見て、があります。
サンプルコード:
@interface Persons {
Person[] value();
}
@Repeatable(Persons.class)
@interface Person{
String hobby default "";
}
@Person(hobby="runing")
@Person(hobby="drawing")
@Person(hobby="watching movies")
public class Tom{
}
反復注釈付きの人@上記のコード、。一つの容器注釈に対応するクラスの背後@Repeatableブラケット。
コンテナのノート、それは何ですか?場所は、他の注釈を保存するために使用されます。それは自身のコメントです。
上記の知識の詳細、およびカスタム注釈構文注釈。今、私たちはユニットテストのために注釈を使用する方法を見て。
知識、私が見て反射上の別の記事の知識反映されるように、これらのノートを使って「要約を使用してJavaリフレクションを。」物体によって反射された取得した後、isAnnotationPresentを呼び出すためのオブジェクトメソッドは、ノートの指定されたタイプを含みます。注記
サンプルコード:
public class Marathonrunner {
@RuningTest
public void test5km(){
System.out.println("进行5公里跑步测试");
}
public void test10km(){
System.out.println("进行10公里跑步测试");
}
@RuningTest
public void test21km(){
System.out.println("进行21公里跑步测试");
}
public void test42km(){
System.out.println("进行42公里跑步测试");
}
}
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.METHOD)
@interface RuningTest{
}
public class RuntestTool {
public static void main(String args[]){
Marathonrunner xiaoming = new Marathonrunner();
Class clazz = xiaoming.getClass();
Method[] methods = clazz.getDeclaredMethods();
for (Method method : methods) {
if(method.isAnnotationPresent(RuningTest.class)){
try {
method.setAccessible(true);
method.invoke(xiaoming, null);
} catch (Exception e) {
}
}
}
}
}
結果:
进行21公里跑步测试
进行5公里跑步测试
上記のコードは、我々は、任意の変数を持っていないRuningTestノートを定義します。唯一の方法でこのRuningTestコメントの規定の@Targetメタアノテーション、@Retentionメタ注釈値の値は、実行時に情報を指定@Retentionと@Targetメタ注釈の変更を使用して、この注釈は、注釈を得ることができます。
遠くクラス動員Marathonrunnerマラソンを定義し、4つの方法があります。
それはMarathonrunner選手のアプローチをテストするために設計されたクラスを定義します。私たちは、クラスをテストする場合@RuningTestアノテーション付きメソッドがテストされることはありませんせずに、単に、そのクラスに@RuningTestコメントを追加します。test5km()とtest21km()メソッドは、彼らがテストした、@RuningTestノートを追加されます。
春、MyBatisの注釈GFアプリケーションでノート。特に下のメモを話すに記事を書かれた次の春のアプリケーション。
概要:
本論文では、コンセプトノート、元のノートの概念を説明し、どのようにユニットテストの独自の定義を使用する注釈、メモなどをカスタマイズする方法。