- 追加された行はこの色です。
- 削除された行はこの色です。
[[HOME>http://www.trance.co.jp/]] > [[技術情報]] > [[Java>http://www.trance.co.jp/wiki/index.php?%B5%BB%BD%D1%BE%F0%CA%F3#xe479566]] > リフレクション
* リフレクション [#xf246616]
** リフレクションとは [#v07ce870]
** 使用方法 [#sa82e111]
*** クラス [#t0d3b4c5]
*** メソッド [#p0a34105]
*** フィールド [#cdefbb86]
** リフレクションを用いた実装 [#o2c23082]
*** Mapに格納されている値からJavaBeansオブジェクトを生成する. [#vcc9019c]
- ''説明''
JavaBeansクラスのインスタンス変数名とMapのKeyがマッチする値をセットしたJavaBeanオブジェクトを生成する.
//使用例としては、リクエストパラメータのパラメータ名がJavaBeansのインスタンス変数名と同一の場合、
// HttpServletRequest request = HTTPリクエストを取得する.
// Person person = new Person();
// person.setName(request.getParameter("name"));
// person.setAge(request.getParameter("age"));
//とせず、
// HttpServletRequest request = HTTPリクエストを取得する.
// Person person = (Person) TaBeanUtils.createBean(Person.class, //request.getParameterMap());
//とすることで、リクエストパラメータからPersonオブジェクトを生成できる.&br;
&color(red){注意};
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);
}
}
- ''解説''
-- &color(blue){''POINT 1''}; - ''クラス内の全てのフィールドを取得する''
JavaBeansのフィールドは、「private」であるため、「Class#getFields()」ではなく、「Class#getDeclaredFields()」を使用し、クラス内の全てのフィールドを取得する。&br;&br;
|~メソッド|~説明|
|Class#getDeclaredFields()|クラス内の全てのフィールドを取得する。|
|Class#getFields()|クラス内の「public」フィールドを取得する。|
&br;
-- &color(blue){''POINT 2''}; - ''フィールドの修飾子を取得する''
インスタンス変数は「private」であり、フィールドの修飾子を調べる必要があるため、下記メソッドを使用し、フィールドの修飾子を取得する。&br;&br;
|~メソッド|~説明|
|Field#getModifiers()|フィールドの修飾子を取得する|
&br;下記メソッドを使用し、フィールドの修飾子をチェックする。&br;&br;
|~メソッド|~説明|
|Modifier.isPrivate()|修飾子が「private」であるか?|
|Modifier.isStatic()|修飾子が「static」であるか?|
&br;
-- &color(blue){''POINT 3''}; - ''インスタンスを生成する''
下記メソッドを使用し、JavaBeansオブジェクトを生成する。&br;&br;
|~メソッド|~説明|
|Class#newInstances()|インスタンスを生成する。|
&br;
-- &color(blue){''POINT 4''}; - ''指定した名前のフィールドオブジェクトを取得する''
JavaBeansのフィールドは、「private」であるため、「Class#getDeclaredField(String)」を使用し、クラス内指定したフィールドオブジェクトを取得する。&br;&br;
|~メソッド|~説明|
|Class#getDeclaredField(String)|全てのフィールドから指定した名前のフィールドオブジェクトを取得する|
|Class#getField(String)|「public」フィールドから指定した名前のフィールドオブジェクトを取得する|
&br;
-- &color(blue){''POINT 5''}; - ''フィールドへのアクセスを許可する''
アクセスフラグを「true」にし、フィールドへのアクセスを許可させる。
-- &color(blue){''POINT 6''}; - ''フィールドに値をセットする''
下記メソッドを使用し、JavaBeansオブジェクトのフィールドに値をセットする。&br;&br;
|~メソッド|~説明|
|Field#set(Object, Object)|オブジェクトの自身のフィールドに指定した値をセットする.|