次の使用例は、リフレクションの正当性と見なされますか?
さまざまなレスポンスを表す XSD (現在プロジェクトにある数百) から生成されたクラスが多数あります。
これらのすべての応答には、拡張するのではなく、共通の応答データ構造が含まれています。
タイムアウトなどのイベントが発生した場合、単一の文字列を特定の値に設定するだけで済みます。
これらのクラスが共通の応答構造を拡張している場合、この応答コードをリフレクションなしで常に設定できますが、そうではありません。
したがって、リフレクションを使用して文字列フィールドのセッターメソッドを取得し、定義済みの値で呼び出すサービス用の簡単なユーティリティを作成しました。私にとって唯一の既知の代替手段は、タイムアウトを処理するコードを複製するクラス固有のメソッドを持つことであり、返される Response クラスの唯一の違いがあります。
protected T handleTimeout(Class<T> timeoutClass) {
try {
T timeout = timeoutClass.newInstance();
Method setCode = timeoutClass.getDeclaredMethod(SET_RESPONSE_CODE, String.class);
setCode.invoke(timeout, Response.TIMEOUT.getCode());
return timeout;
} catch (InstantiationException | IllegalAccessException | SecurityException | NoSuchMethodException | IllegalArgumentException | InvocationTargetException e) {
e.printStackTrace();
throw new RuntimeException("Response classes must have field: \"code\" !");
}
}
関連する事実:
- この setter メソッドは、何百ものインターフェイスの再作成が必要になるため、決して変更しないでください。
私が見逃したいくつかの落とし穴があるかどうか、または同じ結果を達成するリフレクションの代替ソリューションがあるかどうか、誰かが指摘できますか?
編集: XSD で変更を行う権限がないため、解決策はローカルで行う必要があります。このようなオブジェクトはコンポーネント間で共有されるため、シリアル化に問題はありません。