Javaアノテーション


114

Javaでの注釈の目的は何ですか?私は、コメントと実際のコードとの間のどこかにそれらのあいまいな考えを持っています。実行時にプログラムに影響しますか?

それらの典型的な使用法は何ですか?

それらはJavaに固有のものですか?C ++に相当するものはありますか?


9
アノテーションを使用すると、本当に邪悪なことができます。たとえば、Spring Frameworkと、メソッド呼び出しの前にトランザクションを開始し、例外/エラーでロールバックし、正常なトランザクションでコミットする@Transactionalアノテーションを知っている場合。SOC原則(関心の分離)を完全にサポートします。非常にきれいな !Javaルール!:-)

1
3つの質問のようです。2番目自体は広すぎます。
Raedwald 2013

構文によるすべての注釈は、インターフェースのように見えます。では、コンパイラやJVMはその目的をどのようにして知っているのでしょうか。上で説明したように、@オーバーライド->メソッドが適切にオーバーライドされたかどうかのチェックを実行すると仮定します。これは、トランザクション関連のものを実行します。これらすべての注釈について、定義/ロジックはどこにありますか?
Paramesh Korrakuti 2015年

回答:


80

注釈は主に、他のコードを検査するコードによって使用されます。これらは、実行時に既存のクラスを変更(つまり、装飾またはラップ)して動作を変更するためによく使用されます。JUnitHibernateなどのフレームワークは、アノテーションを使用して、フレームワークを使用するために自分で作成する必要があるコードの量を最小限に抑えます。

オラクル社のサイトでは、Javaの概念とその意味について説明しています。


17

また、Javaに固有のものですか?C ++に相当するものはありますか?

いいえ、ただしVBとC#には属性があります同じもののあります。

それらの使用は非常に多様です。典型的なJavaの例の1つ@Overrideはコードに影響を与えませんが、装飾されたメソッドが実際に別のメソッドをオーバーライドしない場合に警告(またはエラー)を生成するためにコンパイラーを使用できます。同様に、メソッドに古いマークを付けることができます。

次に、反射があります。コードにクラスのタイプを反映すると、属性にアクセスして、そこにある情報に従って動作することができます。私はJavaの例を知りませんが、.NETではこれがコンパイラによって使用され、クラスの(逆)シリアル化情報を生成し、構造のメモリレイアウトを決定し、関数のインポート宣言します(特に)レガシーライブラリからの。また、IDEフォームデザイナの動作も制御します。

/ EDIT:クラスの属性は、タグインターフェース(JavaのSerializableなど)に相当します。ただし、.NETコーディングガイドラインでは、タグインターフェイスを使用しないとしています。また、メソッドレベルではなく、クラスレベルでのみ機能します。


13

アンダースは良い要約を与え、そしてこれがJUnit注釈の例です

@Test(expected=IOException.class)
public void flatfileMissing() throws IOException {
    readFlatFile("testfiles"+separator+"flatfile_doesnotexist.dat");
}

ここで、@Test注釈はJUnitに、flatfileMissingメソッドが実行すべきテストであり、期待される結果がスローされることを伝えていIOExceptionます。したがって、テストを実行すると、このメソッドが呼び出され、IOExceptionがスローされたかどうかに基づいてテストが成功または失敗します。


7

Javaには、注釈を作成するだけでなく、ソースコードでこれらの注釈がどのように機能するかを決定する注釈処理ツール(apt)もあります。

こちらが紹介です。


4

Annotationsで実行できるクールな機能を確認するには、JavaBeanアノテーションとアノテーションプロセッサをチェックしください。

これらはコードの生成、ビルド中に追加の検証を追加するのに最適であり、エラーメッセージフレームワークにも使用しています(まだ公開されていません-ボスとクリアする必要があります...)。


1

リテラル定義により、注釈は要素にメモを追加します。同様に、Javaアノテーションは、コードに関する詳細情報を提供するためにソースコードに挿入するタグです。Javaアノテーションは、情報をアノテーション付きプログラム要素に関連付けます。Javaアノテーションのほかに、Javaプログラムには、通常、ソースコードファイルのコメント内に含まれる大量の非公式ドキュメントがあります。ただし、Javaの注釈は、注釈の形式を記述するために注釈型を使用してプログラム要素に直接注釈を付けるコメントとは異なります。Java Annotationsは、情報を標準的かつ構造化された方法で提示するため、処理ツールで快適に使用できます。

詳細を読むために、Javaアノテーションに関する素晴らしいチュートリアルがあります。



0

EJBに関するアノテーションは、明示的なミドルウェアアプローチよりも暗黙的なミドルウェアアプローチを選択することとして知られています。アノテーションを使用すると、銀行振込のトランザクションメソッドを呼び出す必要があるなど、APIから正確に必要なものをカスタマイズします。 :アノテーションを使用しない場合:コードは

transfer(Account account1, Account account2, long amount)    
{
   // 1: Call middleware API to perform a security check
   // 2: Call middleware API to start a transaction
   // 3: Call middleware API to load rows from the database
   // 4: Subtract the balance from one account, add to the other
   // 5: Call middleware API to store rows in the database
   // 6: Call middleware API to end the transaction
}

Annotationを使用している間、コードにはミドルウェアサービスを使用するための面倒なAPI呼び出しは含まれていません。コードはクリーンで、ビジネスロジックに焦点を当てています

transfer(Account account1, Account account2, long amount) 
{
   // 1: Subtract the balance from one account, add to the other
}
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.