クラスとその引数を に格納しMap<Class<?>, Object>
、マップを反復することができます。これにより、if-else コンストラクトが 1 つの if ステートメントによる反復ループに置き換えられます。
たとえば、次のようにします。
Map<Class<?>, Object> map = ... /* initialize */
for (Class cls : method.getParameterTypes()) {
for (Entry<Class<?>, Object> candidate : map.entrySet()) {
if (candidate.getKey().isAssignableFrom(cls)) {
arguments[i] = candidate.getValue()
break; // continue with the next parameter type
}
}
}
具体的な実装は、クラスによって異なります。マップ内のクラスが相互に関係がない場合(スーパークラス、サブクラス、インターフェースなど)、コードを直接適用できます。それ以外の場合は、bestsssが指摘したように、クラス階層を維持するためにスーパー クラス/インターフェイスの反復に固執する必要があります。
さらにJava Annotationsを調査することもできますが、要件の詳細がないと、あなたの場合にそれらを適用する方法が 100% わかりません。スーパークラスに引数で注釈を付けることができます
@Argument("onearg")
public class SomeClass {
/* ... */
}
反復中にメソッドパラメータータイプのスーパークラスをcls.getSuperClass()
取得し、後で割り当てのために注釈付きの引数値を取得します。