Step3:リフレクションAPIで変換ルールを動的に適用する
Step3ではいよいよ読み取ったデータの変換処理を組み込みます。変換ルールはデータ項目に応じて異なるので,
下ごしらえとして,
次に,
最後に,
①で設定ファイルの
そして,
Converter converter = new IntegerConverter();
リフレクションAPIを使用することで,
- 注2)
- 「ガリガリガリクソン」
でググってみてください。
リスト3 Step3:変換ルール用のインタフェース
public interface Converter {
Object convert(Object value);
}
リスト4 Step3:変換ルール実装クラスIntegerConverter
public class IntegerConverter implements Converter {
public Object convert(Object value) {
return Integer.parseInt(value.toString());
}
}
リスト5 Step3:変換ルール実装クラスDateConverter
public class DateConverter implements Converter {
public Object convert(Object value) {
try {
return new SimpleDateFormat("yyyyMMdd")
.parse(value.toString());
} catch (ParseException e) {
throw new RuntimeException(e);
}
}
}
リスト6 Step3:変換ルール実装クラスTrimConverter
public class TrimConverter implements Converter {
public Object convert(Object value) {
return StringUtils.trim(value.toString());
}
}
リスト7 Step3:リフレクションAPIを使用したコード
private static class MessageParser {
...
public void parse() throws Exception {
while (index < bytes.getLength() - 1) {
Map<String, Object> record =
new HashMap<String, Object>();
for (int i = 0; i < config.getRowSize(); i++) {
DataRow row = config.getRow(i);
String name =
(String) row.getValue("データ名称");
int length =
((BigDecimal) row.getValue("バイト数"))
.intValue();
String ruleClassName = ┓
(String) row.getValue("変換ルール"); ┛①
String value = getString(length);
Class<?> clazz = Class.forName(ruleClassName); ┓
Converter converter =   |
(Converter)clazz.newInstance(); ┛②
Object newValue = converter.convert(value); ―③
record.put(name, newValue);
}
System.out.println(record);
}
}
...
}
表3 Excel設定ファイル
No | データ名称 | 長さ | 変換ルール |
---|---|---|---|
1 | 送信日 | 8 | gcw. |
2 | ユーザ名 | 10 | gcw. |
3 | メールアドレス | 20 | gcw. |
4 | ポイント | 5 | gcw. |
COLUMN JavaのリフレクションAPI
リフレクションAPIとは,
Javaでメタプログラミングをする際によく使用するリフレクションAPIとして表aのものがあります。
以下の例ではリフレクションAPIを利用して,
Employee emp = new Employee(1, "田中一郎");
String[] propNames = {"id", "name"};
for (String propName : propNames) {
// プロパティ名をメソッド名に変換(name -> getName)
String methodName = "get" +
propName.substring(0, 1).toUpperCase() +
propName.substring(1);
// メソッド名からメソッドオブジェクトを取得
Method m = emp.getClass().getMethod(methodName);
// メソッドを実行
Object result = m.invoke(emp);
// 戻り値の値を出力
System.out.println(propName + "=" + result);
}
- 注a)
- プロパティの取得には,
java. beansパッケージ使用した方法もあります。
表a JavaのリフレクションAPI
メソッド名 | 説明 |
---|---|
java. | クラス名からClassオブジェクトを取得する |
java. | オブジェクトを生成する |
java. | コンストラクタオブジェクトを取得する |
java. | メソッドオブジェクトを取得する |
java. | フィールドオブジェクトを取得する |