[[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)|オブジェクトの自身のフィールドに指定した値をセットする.|

トップ   編集 差分 バックアップ 添付 複製 名前変更 リロード   新規 一覧 単語検索 最終更新   ヘルプ   最終更新のRSS