clock2015.10.19 07:00
SERVICE
home

リフレクション解説第二回~プログラムの内部構造をデータとして取得~|オブジェクト指向プログラミング(OOP)をおさらいしよう(8)

AUTHOR :  岩谷 和男

プログラムも「一個のデータ」です。

こんにちは。技術チームの岩谷です。本連載ではオブジェクト指向プログラミング(OOP)をおさらいする連載を書かせていただいています。前回リフレクション」について説明させていただいたのですが、その中で

リフレクションとは「プログラムソースコードの記述規則にしたがってプログラムそのものを一個の”データ”とみなしてアクセスを行う技法」です。

と申し上げました。この部分をもう少し説明してほしいというご要望をいただいたので、今回執筆させてください。

今回、Javaソースを2本用意させていただきました。まず「データとして読み取られるクラス」です。(このクラスの具体的な処理内容については知っていただく必要はありません)

 

次に上記クラスの情報を読み取るクラスを掲載します。このクラスにはリフレクションのテクニックが含まれています。

このプログラムを実行すると、以下のような出力結果が得られます。

入力クラスである「Sample001」の情報が読み取られて画面上に出力されたのがお分かりいただけたと思います。具体的に説明をさせてください。まず、5行目で対象のクラスをClassオブジェクトに格納します。次に7行目で「このClassに格納されているフィールドの一覧」を取得しています。そして8行目から続くループ処理内でフィールドの情報を出力しています。ここでは、

  • フィールドの名前
  • フィールドの型
  • フィールドのスコープ(private/publicなど)

を知ることができます。続く12行目からのコードは7行目からのそれとほとんど同じです。違いは7行目では「フィールドの一覧」を取得しているのに対して12行目では「メソッドの一覧」を取得している事です。

いかがでしょうか?5行目で与えられたクラスの情報からこれだけのことを知ることができました。これはまさにリフレクションの機能によって「プログラムがデータとして管理された状態」でそこからデータを取得する事が可能になっていると言えるのです。ちなみに先週の記事で「フレームワークとは?」という記事を執筆させていただきましたが、これらフレームワークにも今回紹介させていただいたテクニックが活かされています。

Note:
今回の記事ではサンプルソースを簡潔にするために「フィールドの一覧」「メソッドの一覧」を取得する方法を紹介させていただくにとどめましたが、これ以外にも「コンストラクタの一覧・アノテーションの一覧・インナークラスの一覧」など多くの「コンパイラが管理すべきデータ」を取得する事が可能です。

まるでEclipse?

ここまでの記事をお読みくださった皆さんは「あれ?これはまるでEclipseのコード補完機能そっくりじゃないか?」とお考えくださったと思います。まさにその通りです。Eclipseはその内部でリフレクションの機能を多用して多くの情報を開発者に提供してくれているのです。

【本連載について】

SERVICE