このブログは99%ののほほんと1%のお菓子でできています。
[PR]上記の広告は3ヶ月以上新規記事投稿のないブログに表示されています。新しい記事を書く事で広告が消えます。
こんちゃ(´・ω・)ノ
今回はリフレクションについてです。
リフレクションとは、クラスの情報を取得して
クラスの生成やメソッドを利用したりするAPIです。
なかなかJavaの中でも難しいところだったりします。
◆例
public class Sample{
public int getCount(){
return 10;
}
}
【サンプル】通常
Sample sample = new Sample();
int count = sample.getCount();
【サンプル】リフレクション
//インスタンス作成
Object instance = Sample.class.newInstance();
//メソッド取得
Method method = Sample.class.getMethod("getCount", new Class[0]);
//メソッド実行
Integer count = (Integer)method.invoke(instance, new Object[0]);
となります。
「え?なんか色々書いてるし通常のほうが簡単でいいんじゃないか?」
と思うかもしれませんが、
これの重要なところは"文字列でメソッドを取得"しているところです。
文字列指定のため、文字列を引数などで動的に変わるようにするだけで、
動的に実行したいメソッドを決定できるのです。
また「Sample.class」の部分は「Class.forName("Sample")」とも書き換えられるため、
クラスもメソッドも動的に決定できるわけです。
◆リフレクションを使って取得できる情報または処理
・クラス名とクラスのインスタンス
・メソッドとメソッドの実行
・フィールドの名前と値
・コンストラクタ
などなど。まだ色々あると思います。
◆メリッド
リフレクションを使用することにより、
動的に使用するクラスやメソッドを変えることができる。
◆デメリット
・クラスやメソッドが変わるため例外がcatchしずらい。
・実行されるまでどのクラスやメソッドを使用するのかわからないため、処理の流れがわかりにくい。
・インタプリタ実行のため処理速度が遅い。
→ループ文などで何度も呼ばなければ全然気にならない程度。
◆使用されている機能
一般的なプログラミングではあまり使用しませんが、
StrutsなどのWebアプリケーションのフレームワークなどで多く使用されています。
COMMENT