質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.51%
Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

アノテーション

アノテーションとは、特定のコードに対して、メタデータを注釈として付与することを指します。また、付与したメタデータ自体をアノテーションと呼ぶ場合もあります。

リフレクション

リフレクションとは、プログラムの実行過程でプログラム自身の構造を読み取り、編集する事が出来るプロセスのことを指します

Q&A

解決済

2回答

989閲覧

アノテーションはどのような場合に自作するか

lupus_dingo

総合スコア257

Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

アノテーション

アノテーションとは、特定のコードに対して、メタデータを注釈として付与することを指します。また、付与したメタデータ自体をアノテーションと呼ぶ場合もあります。

リフレクション

リフレクションとは、プログラムの実行過程でプログラム自身の構造を読み取り、編集する事が出来るプロセスのことを指します

0グッド

1クリップ

投稿2018/05/04 05:47

編集2018/05/04 06:24

お世話になっております。

Java関連の書籍を読んでいると以下のような事が書いてあります。
「アノテーションはそれ自身がなにかを行うのではなく、プログラムに対するメタデータの付与として利用する」

この意味は、動作には影響は与えないが、このメソッドやフィールドはこういう物ですよ、という情報を付与する(ただの情報なのでoverrideのように必須ではない)というように読み取れます。

しかしspringフレームワークのautowiredやjunitのrunwithのように動作に影響を与えている(むしろないと動かない)物もあります。
なのでちょっと府に落ちません。

そもそもアノテーションはどのような場合に実装されるものなのでしょうか?またアノテーションで実装した方がいい場合などもあるのでしょうか?

今までアノテーションを実装するような事がなかったので疑問に思っています。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

ベストアンサー

そもそもアノテーションはどのような場合に実装されるものなのでしょうか?

何らかの汎用的な枠組み(=フレームワーク)を提供したいとき、同フレームワークへの指示を与える目的で アノテーション(Annotation) が利用されることが多いです。質問文で挙げられている Spring や JUnit といったフレームワークは、まさにこの用途でアノテーションを利用しています。

またアノテーションで実装した方がいい場合などもあるのでしょうか?

どのような機能をアノテーションとして実装するかは、フレームワークの設計思想次第なところが大きいと思います。一般的には、アプリケーションの具体的な処理ロジックとは直接関係しない、フレームワーク上での共通的な振る舞いを表現するために利用されます。

Springの@AutowiredやJUnitの@Runwithは、まさに後者「そのフレームワークを使うに当たって共通的なプログラムの振る舞い」を表現しています。(コンポーネント間の依存性解決、単体テストの実行指示)


「アノテーションはそれ自身がなにかを行うのではなく、プログラムに対するメタデータの付与として利用する」
この意味は、動作には影響は与えないが、このメソッドやフィールドはこういう物ですよ、という情報を付与する(ただの情報なのでoverrideのように必須ではない)というように読み取れます。
しかしspringフレームワークのautowiredやjunitのrunwithのように動作に影響を与えている(むしろないと動かない)物もあります。

ここで言う アノテーション=メタデータ とは、「プログラミング言語Javaの言語仕様としては直接解釈しない付加情報(メタデータ)ですよ」という解釈が妥当です。あるアノテーションの 意味 を定義するのは、そのアノテーションを定義しているフレームワークの役割です。フレームワークは、実行時にユーザコードにつけられたアノテーションを取得・解釈し、フレームワーク自らが決めた動作仕様に従って処理します。

@Overrideアノテーションなどの“事前定義アノテーション”はJavaコンパイラが解釈・処理するため、Java言語仕様と密接な関係にあります。これらのアノテーションは特別扱いした方がよいかもしれませんね...)

Oracle/Java公式ドキュメントの Annotations も参照ください(英語)。

投稿2018/05/04 08:37

yohhoy

総合スコア6189

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

lupus_dingo

2018/05/04 10:00

回答ありがとうございます。 勉強になりました。 メソッドの内容とは関係ないけど実現したいこと、たとえば ・メソッド開始前と終了後にログを出力したい ・ログインしてる場合のみメソッドを実行したい などは、処理を外だししてしまえばコードはすっきりするけどそれをアノテーションで実現するかは設計次第という感じでしょうか。 あと、動作に影響しているアノテーションの方が確かに多いと思うのでoverrideは特殊なんですね。
yohhoy

2018/05/07 10:28 編集

アノテーションはいわゆる AOP(Aspect Oriented Programming; アスペクト指向プログラミング) のために利用されることが多いと思います。上記コメントで言及されている振る舞い(ログ出力、ログイン確認)は、まさにAOP向けの典型例として紹介される処理ですね。
lupus_dingo

2018/05/06 02:17

ありがとうございます。 参考になりました。
guest

0

前半の方についてコメントしてみます。

動作には影響は与えないが、このメソッドやフィールドはこういう物ですよ、という情報を付与する

アノテーション自体は確かにクラスやメンバー(フィールドやメソッド)や引数などに、「Javaの言語仕様でサポートされていないような意味付け(メタな情報)のマーク」を付けるためのものですが、コンパイル時にアノテーションプロセッサーを使って、あるいは実行時にリフレクションを使ってそのマークを検出して色々なことが行えるような仕組みが備わっているため、そのようなプログラムを併用すると「動作に影響を与えることもできる」ものです。

そうしたものを何も使わなければおっしゃるとおり「ただのマーク」にしかすぎません。

アノテーションプロセッサーを活用している例ではLombokが思い浮かびます。これはgetter/setterの自動生成をしてくれたりしますが、マクロ展開っぽいこともできるという一例だと思います。言語仕様の拡張とまではいかなくても糖衣構文的なものは実現できたりするのではないでしょうか。

とはいえ、Lombokのようにアノテーションプロセッサーを使うような応用は言語処理系の専門家っぽい人がやることでアプリケーション開発者のだれでもがほいほいやるようなものではない印象です。

一方、リフレクションを用いて実行時にアノテーションをチェックし何か特別な動作をする程度であればわりと簡単にできる印象です。リフレクションを利用するため多少ミドルウェアっぽい設計をすることになりますが。


そもそもアノテーションはどのような場合に実装されるものなのでしょうか?またアノテーションで実装した方がいい場合などもあるのでしょうか?

自分はDIとかAOPという単語が思い浮かぶ程度で、コメントできるほどの知識がないです。開発に対する取り組み方もプロの方と大分違う気がしますし。

自分の場合「ちょっとこういうメタな情報を付けておこう」なんて感じで割と気軽にアノテーションを定義しますが、プロの方から見れば「自前でミドルウェアっぽいことをほいほいやってしまうなんて安直すぎる、このフレームワーク使えば済むではないか」と言われてしまう気がします...><

投稿2018/05/04 07:10

KSwordOfHaste

総合スコア18392

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

lupus_dingo

2018/05/04 10:06

回答ありがとうございます。 使ったことありませんがLombokもアノテーションでしたね。ゲッターセッターくらいIDE使えば簡単に生成できますが、ステップ数を減らして読み易さを向上させるのが目的なんでしょうかね。 話がそれましたがアノテーション+リフレクションにするか、通常の外だしにするかは設計次第のようですね。 参考になりました。
KSwordOfHaste

2018/05/04 11:15 編集

IDEでの自動生成とLombokなどの違う点はIDEで自動生成したものはリファクタリングツールが必要(ソースを改変する際にどうしても複数個所の変更をしなければならい)のに対しアノテーションプロセッサーによる方法はそういうことがないという話を聞いたことがあります。IDEにはリファクタリング機能が付いているから大した違いでないといえるのかもしれませんが・・・ メタ情報はアノテーション以外にもXMLなどを用い外側に分離する方式もよく行われると思いますが、後者は仕組みが若干面倒なのでアノテーション+リフレクションの方が手軽かなという印象はあります。
lupus_dingo

2018/05/06 02:17

ありがとうございます。 参考になりました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.51%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問