FC2ブログ

スポンサーサイト

-------- --:--:-- --

上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。

【Java】PropertyDescriptor で setter/getter メソッドを取得・値を設定する その2

2011-07-01 03:44:27 Fri

この記事がわかりにくく、しかもソースが終わっているので少しはマシに書き直します。

PropertyDescriptor の要点



1.セッター

// フィールド名とクラスをコンストラクタの引数にインスタンス生成
PropertyDescriptor pd = new PropertyDescriptor(propertyName, entity.getClass());
// セッターメソッドを取得する
Method setterMethod = pd.getWriteMethod();
// セッターメソッドを動的実行
setterMethod.invoke(entity, value);


PropertyDescriptorのコンストラクタで値を設定したいプロパティ名とエンティティのクラス型を与えてインスタンス化する。
そこからPropertyDescriptor#getWriteMethod にてそのプロパティのセッターメソッドを取得。
そのあと、リフレクションを利用してinvokeで処理を委譲すればエンティティオブジェクトに値が設定される。

2.ゲッター

// フィールド名とクラスをコンストラクタの引数にインスタンス生成
PropertyDescriptor pd = new PropertyDescriptor(propertyName, entity.getClass());
// ゲッターメソッドを取得する
Method getterMethod = pd.getReadMethod();
// ゲッターメソッドを動的実行
Object ret = getterMethod.invoke(entity);


PropertyDescriptorのコンストラクタで値を取得したいプロパティ名とエンティティのクラス型を与えてインスタンス化するのは、セッターと同じ。
そこからPropertyDescriptor#getReadMethod にてそのプロパティのゲッターメソッドを取得。
そのあと、リフレクションを利用してinvokeで処理を委譲すればエンティティオブジェクトの値を取得できます。
とても簡単です。
簡単なのでユーティリティを作成しました。

import java.beans.PropertyDescriptor;
import java.lang.reflect.Method;

/**
 * エンティティを扱う際のユーティリティクラスです。
 * @author isann
 *
 */
public class EntityUtils {

	/**
	 * カプセル化されたエンティティオブジェクトに動的に値を設定します。
	 * @param entity エンティティオブジェクト
	 * @param propertyName プロパティ名
	 * @param value 設定する値
	 */
	public static final void setEntityValue(Object entity, String propertyName, Object value){
		try {
			// フィールド名とクラスをコンストラクタの引数にインスタンス生成
			PropertyDescriptor pd = new PropertyDescriptor(propertyName, entity.getClass());
			// セッターメソッドを取得する
			Method setterMethod = pd.getWriteMethod();
			// セッターメソッドを動的実行
			setterMethod.invoke(entity, value);
		} catch (Exception e) {
			e.printStackTrace();
			throw new RuntimeException(e);
		}
	}

	/**
	 * カプセル化されたエンティティオブジェクトから動的に値を取得します。
	 * @param clazz エンティティのクラス
	 * @param entity エンティティオブジェクト
	 * @param propertyName プロパティ名
	 * @return エンティティオブジェクトのプロパティから取得した値。
	 */
	public static final Object getEntityValue(Object entity, String propertyName){
		Object ret = null;
		try {
			// フィールド名とクラスをコンストラクタの引数にインスタンス生成
			PropertyDescriptor pd = new PropertyDescriptor(propertyName, entity.getClass());
			// ゲッターメソッドを取得する
			Method getterMethod = pd.getReadMethod();
			// ゲッターメソッドを動的実行
			ret = getterMethod.invoke(entity);
		} catch (Exception e) {
			e.printStackTrace();
			throw new RuntimeException(e);
		}
		return ret;
	}

}


使うならこんなふう。

import java.lang.reflect.Field;
import java.math.BigDecimal;
import java.util.Date;

public class PDTest {

	public static void main(String[] args) {

		// Method クラスにてメソッドを実行する際のメソッド実行インスタンス
		OutDto outDto = new OutDto();

		// OutDto クラスで定義されたフィールドを全取得(継承クラスなどは取得しないので getDeclaredFields メソッドを使用)
		Field[] fields = outDto.getClass().getDeclaredFields();
		
		// Method クラスにてメソッドを実行する際のパラメータ
		Object[] paramsList = {Integer.valueOf(100), "文字列テスト", new BigDecimal("55"), new Date()};
		
		// 値の設定
		for(int i = 0; i < fields.length; i++){
			String propertyName = fields[i].getName();
			try {
				EntityUtils.setEntityValue(outDto, propertyName, (Object)paramsList[i]);
			} catch (Exception e) {
				e.printStackTrace();
				break;
			}
		}

		// 設定した値の確認
		for(int i = 0; i < fields.length; i++){
			String propertyName = fields[i].getName();
			try {
				System.out.println(EntityUtils.getEntityValue(outDto, propertyName));
			} catch (Exception e) {
				e.printStackTrace();
				break;
			}
		}
	}




Dtoは前と同じこれ。


import java.math.BigDecimal;
import java.util.Date;

public class OutDto {

	private int out1 = 0;
	private String out2;
	private BigDecimal out3;
	private Date out4;

	public int getOut1() {
		return out1;
	}
	public void setOut1(int out1) {
		this.out1 = out1;
	}
	public String getOut2() {
		return out2;
	}
	public void setOut2(String out2) {
		this.out2 = out2;
	}
	public BigDecimal getOut3() {
		return out3;
	}
	public void setOut3(BigDecimal out3) {
		this.out3 = out3;
	}
	public Date getOut4() {
		return out4;
	}
	public void setOut4(Date out4) {
		this.out4 = out4;
	}

スポンサーサイト

⇒comment

Secret

名言集
全記事(数)表示
全タイトルを表示
ブログ内検索
Loading
上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。