2011-12-08 9 views
3

レッツを正式なパラメータリストをマッチングは、私は反射によりsetParameter方法を取得したいと思い、私はこのJavaのリフレクション - 実際のパラメータリストに

public class Foo { 
    public void setParameter(String name, Object value) { 
     // ... 
    } 
} 

ようなクラスFooを持っていると言います。

私のコードでは、このメソッドを取得する必要があるときは、ACTUALのパラメータしか知りません。私はClass実際のパラメータの配列を私に与えることができる少しの方法を構築している。残念ながら実パラメータ([String.class, String.class])から返さClass配列は、仮パラメータ([String.class, Object.class])getDeclaredMethodClass配列は、例外を発生させNoSuchMethodExceptionと一致していません。

メソッドに一致するライブラリやコードスニペットを知っていますか?

答えて

4

おそらく、どのメソッドを呼び出すかについて少し賢明にする必要があります。 1つの方法は、getDeclaredMethods()から各メソッドを繰り返し、メソッドの名前を確認して呼び出したいかどうかを確認し、実際のパラメータの数が仮パラメータの数と一致するかどうかをチェックし、最後に実際のパラメータを繰り返し、仮パラメータクラスからパラメータクラスを割り当てることができるかどうかをチェックします。そのテストに一致する両方として

public void setParameter(String name, Object value); 
public void setParameter(String name, String value); 

一つの問題は、しかし、あなたはメソッドを持っている場合、何が起こるかです。

私は軽い方法でそれを扱うことができる私の頭の上のどのライブラリも知らない。ほとんどの依存性注入フレームワーク(Spring、Guice)は、彼らの必要性のためにいくつかのサポートを持っていますが、それらがどのように動作するかを調べる価値があるかもしれません。

Jon Skeetの回答hereには、私が説明している例があります。

+0

私の場合、メソッドはインターフェイスから来て、最初のものだけを提供します。 – Stephan

+0

@Stephanの両方のメソッドは、クラスでは間違いなく受け入れられます。コンパイラは、最もマッチしたメソッドを使用します。 2つのメソッドが等しく一致する場合。 (Object、String)と(String、Object)を使用する場合は、コンパイラを特定のメソッドに向けるためにパラメータをキャストする必要があります。 –

+1

+1:スーパークラスのメソッドを繰り返し処理するか、 'getMethods();'を使ってパブリックメソッドを取得する必要があるかもしれません。 –

2

私は単純にすべてのメソッドを取得し、メソッド名、パラメータ数、最後にClass.isAssignableFrom()に基づいてコード内の一致を調べて、パラメータの型がシグネチャと一致するかどうかをチェックします。そのため、オーバーロードされたメソッドのシグネチャは、同じ具体的な型(インタフェースまたはスーパー/サブクラス)と互換性のある型が異なります。このようなコーナーケースをコードでサポートする必要があるかどうかを判断する必要があります。

関連する問題