「Java入門」PropertyDescriptor で setter/getter メソッドを設定するコード

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

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());
//setterメソッドを取得する
Method setterMethod = pd.getWriteMethod();
//setterメソッドを動的実行
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());
// getterメソッドを取得する
Method getterMethod = pd.getReadMethod();
// getterメソッドを動的実行
ret = getterMethod.invoke(entity);
} catch (Exception e) {
e.printStackTrace();
throw new RuntimeException(e);
}
return ret;
}

}

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

public class TestCC {
public static void main(String[] args) {

TestDto cft = new TestDto();

// getDeclaredFields メソッドを使用
Field[] fields = cft.getClass().getDeclaredFields();

// メソッドを実行する際のパラメータ
Object[] paramsList = {Integer.valueOf(44), “テスト”, new BigDecimal(“33”), new Date()};

// 値の設定
for(int i = 0; i < fields.length; i++){
String propertyName = fields[i].getName();
try {
EntityUtils.setEntityValue(cft, 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(cft, propertyName));
} catch (Exception e) {
e.printStackTrace();
break;
}
}
}

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

public class TestDto {

private int obj1 = 0;
private String obj2;
private BigDecimal obj3;
private Date obj4;

public int getObj1() {
return obj1;
}
public void setObj1(int obj1) {
this.obj1 = obj1;
}
public String getObj2() {
return obj2;
}
public void setObj2(String obj2) {
this.obj2 = obj2;
}
public BigDecimal getObj3() {
return obj3;
}
public void setObj3(BigDecimal obj3) {
this.obj3 = obj3;
}
public Date getObj4() {
return obj4;
}
public void setObj4(Date obj4) {
this.obj4 = obj4;
}

}

参考URL
http://isann.blog2.fc2.com/blog-entry-221.html

Comments are closed.