2017-05-12 8 views
2

JAXBによって生成されたクラスはたくさんあり、変更することはできません。オブジェクトのいくつかのプロパティの値をかなり似た方法で取得してから、それらにテーブルを設定する必要があります。同じ名前で異なる戻り値を持つ異なる型のオブジェクトのメソッドを呼び出す方法は?

private String getPropertyIdentifierStringOrNull(IdentifierType obj) 
{ 
    if(obj != null) 
     return obj.getValue(); 
    else 
     return null; 
} 

private XMLGregorianCalendar getPropertyXMLGregorianCalendarOrNull(DateType obj) 
{ 
    if(obj != null) 
     return obj.getValue(); 
    else 
     return null; 
} 

DATETYPEをしてIdentifierTypeは共通supperclassを持っていないし、このサンプルコードのように戻り値は、異なるタイプのものとすることができる:ここで私は、そのような2つのgetterメソッドのコードを与えています。

私はこれらの束の代わりに1つの方法を書こうとしています。

@SuppressWarnings("unchecked") 
private <T> T getPropertyOrNull(Object obj) 
{ 
    if(obj != null) 
    { 
     try 
     { 
      return (T) obj.getClass().getMethod("getValue").invoke(obj); 
     } catch (Exception e) 
     { 
      e.printStackTrace(); 
     } 
    } 
    return null; 
} 

このような種類の呼び出しを行うには、この方法が適していますか、それとも良い解決策はありますか?

+0

私はそれが完璧だと思います。これらのクラスのスーパーインタフェースを追加できない限り、リフレクションが必要です。 –

+0

ありがとう@Tamas、あなたは非常に高速でした。 – milijan

答えて

1

私は反射を使用しません。代わりに、あなたは次のように、特定のオブジェクトから所望の特性を抽出しFunctionでそれを行うことができます:、リフレクションを使用していないほか

IdentifierType identifier = new IdentifierType(); 
DateType date = new DateType(); 

String identifierValue = getPropertyOrNull(identifier, IdentifierType::getValue); 

XMLGregorianCalendar dateValue = getPropertyOrNull(date, DateType::getValue); 

利点を:

static <T, U> U getPropertyOrNull(T obj, Function<? super T, ? extends U> extractor) { 
    return obj != null ? extractor.apply(obj) : null; 
} 

をあなたはこの方法でそれを使用することができますつまり、IdentifierTypeと引数でメソッドを呼び出すと、コンパイルエラーが発生します。

関連する問題