HOME > 技術情報 > Java > リフレクション
リフレクション †
リフレクションとは †
使用方法 †
クラス †
メソッド †
フィールド †
リフレクションを用いた実装 †
Mapに格納されている値からJavaBeansオブジェクトを生成する. †
- 説明
JavaBeansクラスのインスタンス変数名とMapのKeyがマッチする値をセットしたJavaBeanオブジェクトを生成する.
注意
JavaBeansのインスタンス変数の型とセットする値の型が異なる場合エラーとなります.
- ソース
import java.lang.reflect.Field;
import java.lang.reflect.Modifier;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
public class TaBeanUtils {
/**
* Mapに格納されている値からJavaBeansオブジェクトを生成する.
* <pre>
* ■サンプル
* 以下のようなPersonクラスがある場合とする.
* Person.class
* -name:String
* -age:String
* </pre>
* 下記コードでMapに格納されている「name」、「age」の値を
* セットしたPersonオブジェクトが生成される.
* <code>
* Map map = new HashMap();
* map.put("name", "TranceArts");
* map.put("age", "6");
* map.put("test", "test");
* Person person = (Person) createBean(Person.class, map);
* </code>
*
* @param beanClass Beanのクラス
* @param map Beanにセットする値を保持するMapオブジェクト
* @return Mapに格納されている値からJavaBeansオブジェクト
* @throws Exception JavaBeansオブジェクトの生成に失敗した場合
*/
public static Object createBean(Class beanClass, Map map) throws Exception {
// ■POINT 1 ----------------------
Field[] fields = beanClass.getDeclaredFields();
List fieldList = new ArrayList();
for (int i = 0; i < fields.length; i++) {
if (isInstanceValue(fields[i])) {
fieldList.add(fields[i].getName());
}
}
// ■POINT 3 ----------------------
Object bean = beanClass.newInstance();
for (final Iterator iter = fieldList.iterator(); iter.hasNext();) {
String fieldName = (String) iter.next();
// ■POINT 4 ----------------------
Field field = bean.getClass().getDeclaredField(fieldName);
Object value = map.get(fieldName);
if (value == null) {
// Beanにセットする値がない
continue;
}
// ■POINT 5 ----------------------
field.setAccessible(true);
// ■POINT 6 ----------------------
field.set(bean, value);
}
return bean;
}
/**
* インスタンス変数であるか?
* @param field フィールド
* @return true インスタンス変数である
* false インスタンス変数でない
*/
private static boolean isInstanceValue(Field field) {
// ■POINT 2 ----------------------
int modifier = field.getModifiers();
return Modifier.isPrivate(modifier) && !Modifier.isStatic(modifier);
}
}
- 解説
- POINT 1 - クラス内の全てのフィールドを取得する
JavaBeansのフィールドは、「private」であるため、「Class#getFields()」ではなく、「Class#getDeclaredFields()」を使用し、クラス内の全てのフィールドを取得する。
メソッド | 説明 |
---|
Class#getDeclaredFields() | クラス内の全てのフィールドを取得する。 |
Class#getFields() | クラス内の「public」フィールドを取得する。 |
- POINT 2 - フィールドの修飾子を取得する
インスタンス変数は「private」であり、フィールドの修飾子を調べる必要があるため、下記メソッドを使用し、フィールドの修飾子を取得する。
メソッド | 説明 |
---|
Field#getModifiers() | フィールドの修飾子を取得する |
下記メソッドを使用し、フィールドの修飾子をチェックする。
メソッド | 説明 |
---|
Modifier.isPrivate() | 修飾子が「private」であるか? |
Modifier.isStatic() | 修飾子が「static」であるか? |
- POINT 3 - インスタンスを生成する
下記メソッドを使用し、JavaBeansオブジェクトを生成する。
メソッド | 説明 |
---|
Class#newInstances() | インスタンスを生成する。 |
- POINT 4 - 指定した名前のフィールドオブジェクトを取得する
JavaBeansのフィールドは、「private」であるため、「Class#getDeclaredField(String)」を使用し、クラス内指定したフィールドオブジェクトを取得する。
メソッド | 説明 |
---|
Class#getDeclaredField(String) | 全てのフィールドから指定した名前のフィールドオブジェクトを取得する |
Class#getField(String) | 「public」フィールドから指定した名前のフィールドオブジェクトを取得する |
- POINT 5 - フィールドへのアクセスを許可する
アクセスフラグを「true」にし、フィールドへのアクセスを許可させる。
- POINT 6 - フィールドに値をセットする
下記メソッドを使用し、JavaBeansオブジェクトのフィールドに値をセットする。
メソッド | 説明 |
---|
Field#set(Object, Object) | オブジェクトの自身のフィールドに指定した値をセットする. |