技術の犬小屋

Webプログラミングを餌に生きる犬のメモ帳

Javaのリフレクションについて勉強したのでメモしておく。
 

リフレクションとは

リフレクション (reflection) とは,プログラムの実行過程でプログラム自身の構造を読み取ったり書き換えたりする技術のことである。通常リフレクションというと動的(実行時)リフレクションのことを指すが,静的(コンパイル時)リフレクションをサポートするプログラミング言語もある。リフレクションはSmalltalk,Java,.NET Frameworkのような仮想機械やインタプリタ上で実行されることを想定した言語でサポートされることが多く,C言語のような機械語として出力されることを想定した言語でサポートされることは少ない。
 

リフレクションの危険性

リフレクションを使用することは便利である反面,以下のような危険を伴うことに注意しなければならない。

クラス設計を破壊するかもしれない

リフレクションは,クラス設計者の意図に反したことが出来てしまう強力な機能である。クラスは,オブジェクト指向の基本概念である「カプセル化」に沿って作成されるので,オブジェクトの使用者が外部からクラス(インスタンス)を操作するには,必ずアクセサを使用しなければならないというルールが設けられる。しかし,リフレクションはこのルールを無視し,クラス(インスタンス)を直接操作することを可能にしてしまう。つまり,リフレクションは既存のクラス設計を破壊してしまう可能性がある。
 

コンパイル時はエラーの検出対象外である

リフレクションを使用した部分のコードは,コンパイラやリファクタリングツールのチェック機能外となり,コンパイル時にエラーを検出することができない。これにより,リフレクションによって引き起こされたエラーはプログラム実行時にのみ検出されるので,デバッグの敷居も上がってしまう。
 

リフレクションの使い方

リフレクションを使用することは,上記で説明したような危険性を伴うが,やはり適所で使用する分にはとても便利である。
以下より,Javaにおけるリフレクションの使い方を説明する。
 

サンプルコード

Javaでは,クラスを扱う為にjava.lang.Classというクラスが用意されている。これはjava.langパッケージに含まれているので,コード中でインポートを行う必要はない。
以下のコードはJavaのリフレクションを扱ったサンプルコードである。

Class cl = Class.forName("Foo");
Method method = cl.getMethod("hello");
method.invoke(cl.newInstance());

 
1行目では,Fooクラスのオブジェクトを取得している。2行目では,Fooクラスのオブジェクトから,helloメソッドのオブジェクトを取得している。3行目では,Fooクラスのオブジェクトから,新たなFooクラスのインスタンスを生成し,helloメソッドを呼び出している。
 
 
以上
 
 
参考
リフレクション (情報工学) – Wikipedia
実は怖いjavaリフレクションの話 | ジャイアントモリンキーのjavaテック
Javaリフレクションメモ(Hishidama’s Java Reflection Memo)
リフレクション – 愚鈍人

WordPressテンプレートタグの使い方 arrow-right
Next post

arrow-left Amazon Linuxにvsftpをセットアップする方法
Previous post

コメントを残す