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