2

methodName (String) と parameters(Object[]) の引数をとるメソッド callMethod があります。さて、最初はすべて順調に思えたのですが、問題が発生しました。リフレクションを使用するには、オブジェクトのタイプを知っている必要があります。これまでのところ、次のように決定していました。

Class[] getParameterTypes(Object[] parameters) {
    Class[] parameterTypes = new Class[parameters.length];
    for (int i = 0; i < parameters.length; i++) {
        parameterTypes[i] = parameters[i].getClass();
    }
    return parameterTypes;
}

callMethod は、外部ソースからメソッドを呼び出すために使用されます。そして、それらのメソッドがプリミティブパラメーターを型として持っている場合、またはインターフェイス (リストなど) がある場合に失敗するように見えますが、その理由はわかっています。

私の質問は次のとおりです:これを回避して/同様の方法を維持する方法はありますか、または唯一の解決策は、型情報(プリミティブのfe Integer.TYPEなど)を上記のメソッドに渡すことです:

callMethod(String methodName, Object[] parameters, Class[] parameterTypes);

助けてくれてありがとう。

4

1 に答える 1

3

呼び出し元が変数の型に基づいてオーバーロードの解決を期待している場合、コードは失敗します。例えば:

void foo(String x) {}
void foo(Object x) {}

Object x = "text";
foo(x);

...foo(Object)ではなくを呼び出しfoo(String)ますが、リフレクション コードは を呼び出しますfoo(String)

さて、あなたのユースケースについて、それが問題であるかどうかを判断するのに十分な情報がありません. 呼び出し元呼び出したいメソッドとパラメーターの型を正確に知っている場合は、それらを渡すのが最善です。

上記の状況がコンテキスト内で発生しない場合は、リフレクション コード内で何らかの基本的なオーバーロード解決を実行することをお勧めします。

  • 正しい名前と正しいのパラメーターを持つすべてのメソッドを見つけます。
  • 各メソッドをチェックして、すべての引数値が対応するパラメーターの型に割り当て可能かどうかを確認します (参照Class.isAssignableFrom- プリミティブを個別に処理する必要がある場合があります)。
  • 一致するメソッドが複数ある場合は、いくつかのルールを適用して、呼び出すメソッドを決定します。これらのルールは Java と同じである必要はありませんが、明確にする必要があります。
于 2013-01-07T08:47:31.447 に答える