Java リフレクション が簡単に

Chat&Messenger チャットもメッセンジャーも!! Chat&Messenger チャットもメッセンジャーも!!
LAN上でチャットとメッセンジャーが簡単に利用できるフリーソフトChat&Messengerを紹介します。IP Messenger互換。付箋紙にも対応。

Java リフレクション が簡単に

Java リフレクション が簡単に。 BeanUtil

javaリフレクションAPIを簡単に利用できるユーティリティークラスを紹介します。

リフレクションとは

リフレクションAPIは、「java.lang.reflect」パッケージに含まれており、 Javaクラスからフィールドやメソッドなどの情報を取得するAPIです。 主に以下のクラスを使用します。

  • java.lang.Class
  • java.lang.reflect.Constructor
  • java.lang.reflect.Method
  • java.lang.reflect.Field

リフレクションを使えば、クラス生成やメソッド呼び出しを直接コーディングすることなく、 文字列からクラスのインスタンスを生成したり、メソッドを実行することができます。

クラス名やメソッド名の定義はXMLなどの外部ファイルへ記述することで、アプリケーションを実行時の環境の変化に動的に対応させることができます。 また、柔軟性の高いアプリケーションを構築するうえで非常に有効なAPIとなっています。

リフレクションの目的

リフレクションはユーザーが直接使うことはあまり多くないのですが、 Struts等のWebアプリケーションやO/Rマッピング等のフレームワーク内では多用されています。
例えば、Web画面の入力データをJavaBeansプロパティに自動設定する場合や、 JavaBeansプロパティを元に自動的に更新するSQLを発行する場合などに利用されています。

また、アプリケーションの起動時に機能を拡張するプラグインを動的に読み込んで登録するといった機能はリフレクションを使うと簡単に実現できます。

サンプルの実行

では、サンプルを実行して頂き、是非フレームワーク的なプログラミングを体感してください。
ここでは以下のクラスを使用しリフレクションユーティリティの簡単な使い方を示しています。
Main.java・・・実行するクラス
BeanUtil.java・・・リフレクションのユーティリティクラス
FreeSoft.java・・・フリーソフを表すクラスでリフレクションとして利用されます。

●通常通り実行した場合

System.out.println(">>>通常の場合");
FreeSoft freeSoft = new FreeSoft();
freeSoft.setName("Chat&Messenger チャットもメッセンジャーも!!");
freeSoft.showName();
freeSoft.showPrice(0);

●リフレクションを使用して実行した場合
System.out.println(">>>リフレクションを使用した場合");
// FreeSoftクラスのインスタンス生成
Object invokeObject = BeanUtil.newInstance("FreeSoft");
// nameフィールドに値をセットする。
BeanUtil.setProperty(invokeObject, "name" , "Chat&Messenger チャットもメッセンジャーも!!");
// FreeSoftのshowName()メソッドを実行します。
BeanUtil.invoke(invokeObject, "showName", null);
// FreeSoftのshowPrice()メソッドを実行します。
// メソッドに引数がある場合はObject型の配列で渡す必要がある。
BeanUtil.invoke(invokeObject, "showPrice",new Object[]{new Integer(0)});

●実行結果
通常の場合も、リフレクションを使用した場合も実行結果は同じですね。
>>>通常の場合
ソフト名:Chat&Messenger チャットもメッセンジャーも!!
価格 :0円

>>>リフレクションを使用した場合
ソフト名:Chat&Messenger チャットもメッセンジャーも!!
価格 :0円

BeanUtilメソッド詳細

newInstance

public static Object newInstance(String className)
                                    throws Exception
文字列「className」からインスタンスを生成し返します。

パラメータ:
className - 完全修飾クラス名
戻り値:
完全修飾クラス名の新しいインスタンス
例外:
Exception

newInstance

public static Object newInstance(String className,
                                           Object[] argObj)
                                    throws Exception
文字列「className」からインスタンスを生成し返します。

パラメータ:
className - 完全修飾クラス名
argObj - コンストラクタの引数
戻り値:
完全修飾クラス名の新しいインスタンス
例外:
Exception

newInstance

public static Object newInstance(Class clazz)
                                    throws Exception
クラス「clazz」からインスタンスを生成し返します。

パラメータ:
clazz - クラス
戻り値:
clazzの新しいインスタンス
例外:
Exception

newInstance

public static Object newInstance(Class clazz,
                                           Object[] argObj)
                                    throws Exception
クラス「clazz」からインスタンスを生成し返します。

パラメータ:
clazz - クラス
argObj - コンストラクタの引数
戻り値:
clazzの新しいインスタンス
例外:
Exception

setProperty

public static void setProperty(Object invokeObject,
                               String fieldName,
                               Object value)
                        throws Exception
オブジェクト「invokeObject」のフィールド「fieldName」のsetterメソッドを 呼び出し、値「value」を格納します。 setterメソッドがなければフィールドへダイレクトに値を設定します。 ただし、この場合対象プロパティのアクセス修飾子はpublicであること

パラメータ:
invokeObject - 実行対象のオブジェクト
fieldName - 実行対象のオブジェクトのプロパティ名
value - セットする値
例外:
Exception - 以下の例外が発生します。
InvocationTargetException - 基本となるメソッドが例外をスローする場合
IllegalAccessException - この Method オブジェクトが Java 言語アクセス制御を実施し、基本となるメソッドにアクセスでき ない場合
NoSuchMethodException - 指定された名前のメソッドが見つからない場合

getProperty

public static Object getProperty(Object invokeObject,
                                           String fieldName)
                                    throws Exception
オブジェクト invokeObject のフィールド fieldName のgetterメソッドを 呼び出し値を取得します。 getterメソッドがなければフィールドからダイレクトに値を取得します。 ただし、この場合対象プロパティのアクセス修飾子はpublicであること

パラメータ:
invokeObject - 実行対象のオブジェクト
fieldName - 実行対象のオブジェクトのプロパティ名
戻り値:
ゲッターメソッドのリターン値
例外:
Exception - 以下の例外が発生します。
InvocationTargetException - 基本となるメソッドが例外をスローする場合
IllegalAccessException - この Method オブジェクトが Java 言語アクセス制御を実施し、基本となるメソッドにアクセスでき ない場合
NoSuchFieldException - 指定された名前のフィールドが見つからない場合

invoke

public static Object invoke(Object invokeObject,
                                      String callMethod,
                                      Object[] argObjects)
                               throws InvocationTargetException,
                                      IllegalAccessException,
                                      NoSuchMethodException
オブジェクト「invokeObject」のメソッド「callMethod」を実行します。 リターン値がある場合は、Object形として得る事ができます。

パラメータ:
invokeObject - 実行対象のオブジェクト
callMethod - 実行対象のメソッド名
argObjects - 引数がある場合はオブジェクトの配列として渡す。 引数が無い場合はnullを渡します。
戻り値:
「callMethod」を実行したリターン値
例外:
InvocationTargetException - 基本となるメソッドが例外をスローする場合
IllegalAccessException - この Method オブジェクトが Java 言語アクセス制御を実施し、基本となるメソッドにアクセスでき ない場合
NoSuchMethodException - 指定された名前のメソッドが見つからない場合

findMethod

public static Method findMethod(Object invokeObject,
                                                  String callMethod,
                                                  Object[] argObjects)
                                           throws NoSuchMethodException
オブジェクト「invokeObject」のメソッド「callMethod」を検索します。

パラメータ:
invokeObject - 実行対象のオブジェクト
callMethod - 実行対象のオブジェクトのメソッド名
argObjects - 引数がある場合はオブジェクトの配列として渡す。 引数が無い場合はnullを渡します。
戻り値:
指定された引数の条件に一致するMethod オブジェクト
例外:
NoSuchMethodException - 一致するメソッドが見つからない場合、 あるいは名前が "" または ""の場合

setField

public static void setField(Object invokeObject,
                            String fieldName,
                            Object value)
                     throws IllegalAccessException,
                            NoSuchFieldException
実行対象のオブジェクト「invokeObject」のフィールド名「fieldName」に値 「value 」を格納します。

パラメータ:
invokeObject - 実行対象のオブジェクト
fieldName - 実行対象のオブジェクトのフィールド名
value - セットする値
例外:
IllegalAccessException - 指定されたオブジェクトが基本と なるフィールド (またはそのサブクラスか実装側) を宣言する クラスまたはインタフェースのインスタンスではない場合、 ある いはラップ解除変換が失敗した場合
NoSuchFieldException - 指定された名前のフィールドが見つからない場合

getField

public static Object getField(Object invokeObject,
                                        String fieldName)
                                 throws IllegalAccessException,
                                        NoSuchFieldException
実行対象のオブジェクト「invokeObject」のフィールド名「fieldName」の値を 取得します。

パラメータ:
invokeObject - 実行対象のオブジェクト
fieldName - 実行対象のオブジェクトのフィールド名
戻り値:
リターン値
例外:
IllegalAccessException - 指定されたオブジェクトが基本と なるフィールド (またはそのサブクラスか実装側) を宣言する クラスまたはインタフェースのインスタンスではない場合、 ある いはラップ解除変換が失敗した場合
NoSuchFieldException - 指定された名前のフィールドが見つからない場合

hasField

public static boolean hasField(Object object,
                               String fieldName)
                        throws Exception
オブジェクト「object」がフィールド名「fieldName」を 宣言しているかどうかを 確認します。

パラメータ:
object - 検査対象のオブジェクト
fieldName - 検査するフィールド名
戻り値:
宣言している場合true
例外:
Exception

getAllFields

public static java.util.TreeSet getAllFields(Object object)
                                      throws Exception
パラメータ:
object -
戻り値:
例外:
Exception

getShortClassName

public static String getShortClassName(Object object)
オブジェクトから完全修飾していないクラス名を取得します。

パラメータ:
object -
戻り値:

getShortClassName

public static String getShortClassName(String className)
完全修飾名からクラス名を取得します。

パラメータ:
className -
戻り値:

getFieldName

public static String getFieldName(String methodName)
メソッド名からフィールド名を変えします。 JavaBeansの慣例に適合している 必要があります。

パラメータ:
methodName -
戻り値:

isClassExist

public static boolean isClassExist(String className)
完全修飾名「className」が存在するクラス名かを検証します。

パラメータ:
className -
戻り値:

getPropertyDescriptors

public static PropertyDescriptor[] getPropertyDescriptors(Object object)
                                                              throws IntrospectionException
「object」のオブジェクト情報を保持するPropertyDescriptorを返します。

パラメータ:
object -
戻り値:
例外:
java.beans.IntrospectionException

BeanUtilソースコード




ページトップへ
ダウンロード - ダウンロード
更新履歴 - 更新履歴 2008
Java 日付・時刻 - Java 2つの日付の差を求める
Java 日付・時刻 - Java 2つの日付の月数の差を求める
Java 日付・時刻 - Java 日付・時刻の計算 加算・減算が簡単に
Web関連 - IE7で閉じる(window.close)と強制終了の対策
Web関連 - 10の翻訳エンジンを比較できるサイト 翻訳くらべ
Web関連 - Excelの表からHTMLテーブルタグ一発作成
Web関連 - IETester - 複数のIEバージョンの動作確認を行える便利なソフト
Java ファイル・I/O - Java 再帰的にファイルを検索
Thanks Links・リンク集 - おすすめフリーソフトまとめ
Java 特集 - Java タスクトレイのアイコンを表示・点滅
使い方・応用編 - タスクトレイに格納しメモリを節約
使い方・応用編 - ショートカットキー一覧
Thanks Links・リンク集 - Thanks Links
Java ファイル・I/O - Java ファイルコピー(バッファサイズを変更)
Java ファイル・I/O - Java ファイルコピー(簡単・高速)
その他 - 今後の開発予定
その他 - よくある質問
Web関連 - IE7で画面が真っ白の対策
使い方 - 使い方、使用方法
使い方 - ソフト内の名称
使い方 - 起動及び初期設定方法
使い方 - メッセンジャー機能
使い方 - メッセージペインの各種アイコン説明
使い方 - チャット機能
使い方 - ログ参照
使い方 - ファイルやフォルダの送信・受信
使い方 - アプリケーションの環境設定
使い方 - ソート設定と優先順位設定
使い方 - メッセージの保管
使い方 - 不在モード
使い方 - カレンダー機能
使い方 - キャプチャ機能
使い方 - 付箋機能
使い方 - 内部ブラウザ機能
使い方 - フォント設定
使い方・応用編 - configフォルダ及び各種設定ファイルについて
インストール・バージョンアップ - JREのインストール方法
インストール・バージョンアップ - インストール方法
インストール・バージョンアップ - バージョンアップ方法
Java 特集 - Java ログフィルタでHTTPを解析
インストール・バージョンアップ - バージョンアップとリリースポリシー
インストール・バージョンアップ - 初回起動時におけるWindowsファイアウォール注意点
ダウンロード - 過去のバージョンのダウンロード
Java 特集 - Java リフレクション が簡単に
その他 - 確認されている問題
IP Messenger 互換について - IP Messenger 互換について
更新履歴 - 更新履歴 2007
Java 日付・時刻 - Java 日付の妥当性・存在チェック
Java 日付・時刻 - Java 月末日付を取得する
Java 日付・時刻 - Java 現在(今日)の曜日を求める
Java 日付・時刻 - Java 日付文字列をDate型へ変換
Java 日付・時刻 - あらゆる日付・時刻文字列をDate、Calendar型へ変換
その他 - 掲示板・アンケート
インストール・バージョンアップ - アンインストール方法
インストール・バージョンアップ - ソフトに個別のJREを適用させる方法
Java ネットワーク - Java 実行しているマシンのホスト名を取得
その他 - iP ! (アイピー) 2008年 04月号に掲載
Java ネットワーク - Java IPアドレスからホスト名を取得
Java Swing - Java システムアイコンを抽出
Java Swing - Java クリップボードへコピー
Java ファイル・I/O - Java ディレクトリ内のファイル一覧を表示
Java ファイル・I/O - Java XMLEncoderでオブジェクトを保存
その他 - Vistaでのスクリーンショット
Java システム系 - Java 外部コマンドを実行し3つの結果を取得
Java システム系 - Java システムプロパティを見やすく出力
Java システム系 - Java メモリー使用量を取得
Java 文字列 - Java LPAD、RPADで整形
その他 - CM を見る
更新履歴 - 更新履歴 2006
Java 文字列 - Java 文字列内のURLをリンクに変換
Java 文字列 - Java ファイル名から拡張子を取り除く
Java 文字列 - Java ファイル名から拡張子を取得
その他 - 掲示板について
その他 - このサイトについて
その他 - プロフィール
Thanks Links・リンク集 - 相互リンク募集
Thanks Links・リンク集 - リンク集・ソフトウェア
コメント
この記事へのコメント
承認待ちコメント
このコメントは管理者の承認待ちです
2008/07/17(木) 23:11 | | #[ 編集]
承認待ちコメント
このコメントは管理者の承認待ちです
2008/07/18(金) 14:28 | | #[ 編集]
承認待ちコメント
このコメントは管理者の承認待ちです
2008/07/19(土) 20:19 | | #[ 編集]
コメントを投稿する
URL:
Comment:
Pass:
秘密: 管理者にだけ表示を許可する
 
トラックバック
この記事のトラックバックURL
http://sattontanabe.blog86.fc2.com/tb.php/35-d1b8f0a0
この記事にトラックバックする(FC2ブログユーザー)
この記事へのトラックバック
メッセンジャー java messenger ダウンロード ip メッセンジャー ip messenger 互換 ip ポート