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

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ソースコード


ページトップへ
ダウンロード - ダウンロード詳細
更新履歴 - 更新履歴 2014 - 2015
応用編 - ショートカットキー一覧
その他 - プレミアムエディション
その他 - 確認されている問題点と解消方法
その他 - IP Messenger 互換について
インストール / Verup - インストール方法
インストール / Verup - バージョンアップ方法
Thanks Links・リンク集 - おすすめフリーソフトまとめ
インストール / Verup - バージョンアップ方法 インストール無し版
インストール / Verup - 初回起動時におけるWindowsファイアウォール
更新履歴 - 更新履歴 2011 - 2013
更新履歴 - 更新履歴 2009
インストール / Verup - インスートール方法 Mac OSX
インストール / Verup - JREのインストール方法
CAMServer - CAMServer 概要
CAMServer - CAMServer の導入方法
CAMServer - ライセンスのご購入
インストール / Verup - バージョンアップとリリースポリシー
CAMServer - 文書・ファイル共有
ダウンロード - 過去のバージョンのダウンロード
CAMServer - 外部ユーザ取得・ルータ超え
Thanks Links・リンク集 - Thanks Links
インストール / Verup - アンインストール方法
応用編 - バックアップ設定
CAMServer - クライアント利用制限
CAMServer - メッセージログのサーバ集中管理
CAMServer - オフライン時の Email 転送
CAMServer - CAMServer のバージョンアップ
ダウンロード - CAMServer のダウンロード
テレビ会議 / 音声通話 - テレビ会議・音声通話
CAMServer - CAMServer を Windows サービスとして起動
応用編 - パケット追跡について
テレビ会議 / 音声通話 - ヘッドセット・カメラの準備
テレビ会議 / 音声通話 - ヘッドセット・カメラの推奨商品
その他 - SaaS型 オンデマンド型サービスとして提供
その他 - よくある質問
更新履歴 - 更新履歴 2008
Thanks Links・リンク集 - 相互リンク募集
CAMServer - よくある質問 CAMServer 編
メッセンジャー / チャット - 使い方、使用方法
応用編 - 便利な使い方(Tips)
メッセンジャー / チャット - 起動及び初期設定方法
メッセンジャー / チャット - メッセンジャー
メッセンジャー / チャット - メッセージ内のアイコン説明
メッセンジャー / チャット - チャット
メッセンジャー / チャット - ログ参照
メッセンジャー / チャット - ファイルやフォルダの送信・受信
メッセンジャー / チャット - アプリケーションの環境設定
メッセンジャー / チャット - ソート設定と優先順位設定
メッセンジャー / チャット - メッセージの保管
メッセンジャー / チャット - 不在モード
スケジュール / カレンダー - カレンダー
スケジュール / カレンダー - スケジュール共有
メッセンジャー / チャット - キャプチャ
メッセンジャー / チャット - 付箋
スケジュール / カレンダー - ToDo
応用編 - フォント設定
メッセンジャー / チャット - 概要資料PDF版
スケジュール / カレンダー - 会議室・施設予約
応用編 - configフォルダ及び各種設定ファイルについて
CAMServer - 特定商取引に関する法律に基づく表記
インストール / Verup - ソフトに個別のJREを適用させる方法
更新履歴 - 更新履歴 2007 Java システム系 - Java 外部コマンドを実行し3つの結果を取得
Java 文字列 - Java LPAD、RPADで整形
Java 日付・時刻 - Java 2つの日付の差を求める
Java システム系 - Java システムプロパティを見やすく出力
Java システム系 - Java メモリー使用量を取得
Java 文字列 - Java ファイル名から拡張子を取り除く
Java 文字列 - Java ファイル名から拡張子を取得
Java ファイル・I/O - Java ディレクトリ内のファイル一覧を表示
Java ファイル・I/O - Java XMLEncoderでオブジェクトを保存
その他 - Windows100% 2008年9月号に掲載
Java 日付・時刻 - Java 2つの日付の月数の差を求める
Java 日付・時刻 - Java 日付・時刻の計算 加算・減算が簡単に
Web関連 - 10の翻訳エンジンを比較できるサイト 翻訳くらべ
Web関連 - Excelの表からHTMLテーブルタグ一発作成
Web関連 - IETester - 複数のIEバージョンの動作確認を行える便利なソフト
Java ファイル・I/O - Java 再帰的にファイルを検索
Java 特集 - Java タスクトレイのアイコンを表示・点滅
応用編 - タスクトレイに格納しメモリを節約
Java ファイル・I/O - Java ファイルコピー(バッファサイズを変更)
Java ファイル・I/O - Java ファイルコピー(簡単・高速)
Java 特集 - Java ログフィルタでHTTPを解析
その他 - おとなのWindows 2008年 12月号に掲載
Java 特集 - Java リフレクション が簡単に
その他 - iP ! (アイピー) 2008年 04月号に掲載
Java 日付・時刻 - Java 日付の妥当性・存在チェック
Java 日付・時刻 - Java 月末日付を取得する
Java 日付・時刻 - Java 現在(今日)の曜日を求める
Java 日付・時刻 - Java 日付文字列をDate型へ変換
Java 日付・時刻 - Java あらゆる日付・時刻文字列をDate、Calendar型へ
更新履歴 - 更新履歴 2006
Java 文字列 - Java 文字列内のURLをリンクに変換
Java ネットワーク - Java 実行しているマシンのホスト名を取得
Java ネットワーク - Java IPアドレスからホスト名を取得
Java Swing - Java システムアイコンを抽出
Java Swing - Java クリップボードへコピー
Thanks Links・リンク集 - リンク集・その他お勧め
コメント
この記事へのコメント
コメントを投稿する
URL:
Comment:
Pass:
秘密: 管理者にだけ表示を許可する
 
トラックバック
この記事のトラックバックURL
この記事へのトラックバック