javaのリフレクションAPIを簡単に利用できるユーティリティークラスを紹介します。
リフレクションAPIは、「java.lang.reflect」パッケージに含まれており、 Javaクラスからフィールドやメソッドなどの情報を取得するAPIです。 主に以下のクラスを使用します。
リフレクションを使えば、クラス生成やメソッド呼び出しを直接コーディングすることなく、
文字列からクラスのインスタンスを生成したり、メソッドを実行することができます。
クラス名やメソッド名の定義はXMLなどの外部ファイルへ記述することで、アプリケーションを実行時の環境の変化に動的に対応させることができます。
また、柔軟性の高いアプリケーションを構築するうえで非常に有効なAPIとなっています。
リフレクションはユーザーが直接使うことはあまり多くないのですが、
Struts等のWebアプリケーションやO/Rマッピング等のフレームワーク内では多用されています。
例えば、Web画面の入力データをJavaBeansプロパティに自動設定する場合や、
JavaBeansプロパティを元に自動的に更新するSQLを発行する場合などに利用されています。
また、アプリケーションの起動時に機能を拡張するプラグインを動的に読み込んで登録するといった機能はリフレクションを使うと簡単に実現できます。
では、サンプルを実行して頂き、是非フレームワーク的なプログラミングを体感してください。
ここでは以下のクラスを使用しリフレクションユーティリティの簡単な使い方を示しています。
Main.java・・・実行するクラス
BeanUtil.java・・・リフレクションのユーティリティクラス
FreeSoft.java・・・フリーソフを表すクラスでリフレクションとして利用されます。
●通常通り実行した場合
public static Object newInstance(String className) throws Exception
className
– 完全修飾クラス名
Exception
public static Object newInstance(String className, Object[] argObj) throws Exception
className
– 完全修飾クラス名argObj
– コンストラクタの引数
Exception
public static Object newInstance(Class clazz) throws Exception
clazz
– クラス
Exception
public static Object newInstance(Class clazz, Object[] argObj) throws Exception
clazz
– クラスargObj
– コンストラクタの引数
Exception
public static void setProperty(Object invokeObject, String fieldName, Object value) throws Exception
invokeObject
– 実行対象のオブジェクトfieldName
– 実行対象のオブジェクトのプロパティ名value
– セットする値
Exception
– 以下の例外が発生します。
InvocationTargetException
– 基本となるメソッドが例外をスローする場合
IllegalAccessException
– この Method オブジェクトが Java
言語アクセス制御を実施し、基本となるメソッドにアクセスでき ない場合
NoSuchMethodException
– 指定された名前のメソッドが見つからない場合public static Object getProperty(Object invokeObject, String fieldName) throws Exception
invokeObject
– 実行対象のオブジェクトfieldName
– 実行対象のオブジェクトのプロパティ名
Exception
– 以下の例外が発生します。
InvocationTargetException
– 基本となるメソッドが例外をスローする場合
IllegalAccessException
– この Method オブジェクトが Java
言語アクセス制御を実施し、基本となるメソッドにアクセスでき ない場合
NoSuchFieldException
– 指定された名前のフィールドが見つからない場合public static Object invoke(Object invokeObject, String callMethod, Object[] argObjects) throws InvocationTargetException, IllegalAccessException, NoSuchMethodException
invokeObject
– 実行対象のオブジェクトcallMethod
– 実行対象のメソッド名argObjects
– 引数がある場合はオブジェクトの配列として渡す。 引数が無い場合はnullを渡します。
InvocationTargetException
– 基本となるメソッドが例外をスローする場合
IllegalAccessException
– この Method オブジェクトが Java
言語アクセス制御を実施し、基本となるメソッドにアクセスでき ない場合
NoSuchMethodException
– 指定された名前のメソッドが見つからない場合public static Method findMethod(Object invokeObject, String callMethod, Object[] argObjects) throws NoSuchMethodException
invokeObject
– 実行対象のオブジェクトcallMethod
– 実行対象のオブジェクトのメソッド名argObjects
– 引数がある場合はオブジェクトの配列として渡す。 引数が無い場合はnullを渡します。
NoSuchMethodException
– 一致するメソッドが見つからない場合、 あるいは名前が “” または “”の場合public static void setField(Object invokeObject, String fieldName, Object value) throws IllegalAccessException, NoSuchFieldException
invokeObject
– 実行対象のオブジェクトfieldName
– 実行対象のオブジェクトのフィールド名value
– セットする値
IllegalAccessException
– 指定されたオブジェクトが基本と なるフィールド (またはそのサブクラスか実装側)
を宣言する クラスまたはインタフェースのインスタンスではない場合、 ある いはラップ解除変換が失敗した場合
NoSuchFieldException
– 指定された名前のフィールドが見つからない場合public static Object getField(Object invokeObject, String fieldName) throws IllegalAccessException, NoSuchFieldException
invokeObject
– 実行対象のオブジェクトfieldName
– 実行対象のオブジェクトのフィールド名
IllegalAccessException
– 指定されたオブジェクトが基本と なるフィールド (またはそのサブクラスか実装側)
を宣言する クラスまたはインタフェースのインスタンスではない場合、 ある いはラップ解除変換が失敗した場合
NoSuchFieldException
– 指定された名前のフィールドが見つからない場合public static boolean hasField(Object object, String fieldName) throws Exception
object
– 検査対象のオブジェクトfieldName
– 検査するフィールド名
Exception
public static java.util.TreeSet getAllFields(Object object) throws Exception
object
–
Exception
public static String getShortClassName(Object object)
object
–
public static String getShortClassName(String className)
className
–
public static String getFieldName(String methodName)
methodName
–
public static boolean isClassExist(String className)
className
–
public static PropertyDescriptor[] getPropertyDescriptors(Object object) throws IntrospectionException
object
–
java.beans.IntrospectionException