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

トップ   編集 凍結 差分 バックアップ 添付 複製 名前変更 リロード   新規 一覧 単語検索 最終更新   ヘルプ   最終更新のRSS
Last-modified: 2011-04-18 (月) 23:02:58 (2348d)