.NETにしろJavaにしろ、リフレクションを使うのは、あまり実行時の効率が良くないのだろうが、呼出回数が多くなければ、それほど気にならない。
私の場合、どんなときに使うかというと、クラスを特定しない、コンバーターライブラリなどに使用している。
例えば、CSVと定義ファイルから、クラスインスタンスにCSVの項目を動的にマッピングさせるライブラリなど。
以下のような感じで使用している。
<!--
マッピング定義
Column -- CSVカラム
Index : カラム位置
MapProperty : 設定するプロパティ名
FuncName : 変換メソッド
-->
<Mapping OutputColumns="5">
<Column Index="0" MapProperty="EmpNo" FuncName="ConvertEmpNo"/>
<Column Index="1" MapProperty="ExecDate" />
・・・
</Mapping>
/// <summary>
/// クラスインスタンスへの値セット(Reflection版)
/// </summary>
/// <param name="instance">インスタンス</param>
/// <param name="prop">プロパティ情報</param>
/// <param name="value">値</param>
/// <typeparam name="U">インスタンスの型</typeparam>
public static void SetProp<U>(U instance, string prop, object value) {
var p = typeof(U).GetProperty(prop);
if (p == null) {
throw new ArgumentException($"クラス「{typeof(U).ToString()}」にはプロパティ{prop}が存在しません");
}
p!.SetValue(instance,value);
}
ちなみに、FuncNameのメソッドも同様にReflectionを使用して呼び出す。
他にExpressionを使用する方法もあるのだが、式をコンパイルした物をどこかに保存しない場合はReflectionの方がまだ効率が良いかなと・・・
まぁ、データ数がそれほど多くなければ実行速度はあまり気にならない程度。作りやすさや作成時間と実行時間とのトレードオフといったところかな。