2009-07-23 10 views
2

私はインターフェイスがあるとします。広げる平等のチェック

public interface FooInterface { 
     public void someMethod(); 
    } 

を、私はこのインタフェースを実装するクラスを持っている:

public class FooClass implements FooInterface { 
     public void someMethod() { 
      //do cool things 
     } 
     public void someOtherMethod() { 
      //do other cool things 
     } 
    } 

は見つけるための簡単な方法は反射的、あり、 FooInterfaceのsomeMethodまでマップするFooClassのメソッド?

私はこの計算を次のようにしていますが、この計算を行うためにJavaで組み込みのシステムを知っている人は誰でも知りたいですか?私は次のコードを実行しました(バグがあるかもしれませんので、注意してください)。

public boolean isMethodEquality(Method meth1, Method meth2) { 

    //Check declaring classes for equality 
    boolean isAssignable; 
    isAssignable = meth1.getDeclaringClass().isAssignableFrom(
    meth2.getDeclaringClass(); 
    isAssignable |= meth2.getDeclaringClass().isAssignableFrom(
    meth1.getDeclaringClass()); 
    if (!isAssignable) { 
     return false; 
    } 
    //check the names for equality 
    if (!meth1.getName().equals(meth2.getName())) { 
    return false; 
    } 
    //check the parameters for equality 
    if (meth1.getParameterTypes().length != meth2.getParameterTypes().length) { 
    return false; 
    } 
    for (int i = 0; i < meth1.getParameterTypes().length; i++) { 
    if (!meth1.getParameterTypes()[i].equals(meth2.getParameterTypes()[i])) { 
     return false; 
    } 
    } 
    return true; 
} 

上記は署名をチェックする必要があります。これを行うための組み込みの方法がありますか?

私は.equalsに同意しましたが、これはうまくいかず、意味があります。これらのメソッドは、同じメソッドの異なる実装パターンです(ここでは、1つは定義のない宣言で、もう1つは定義です)。

はまた、私は単純に継承注釈を追加することができます実現が、それはクラスの爆発につながった可能ように私はこれを避けることを好むだろう。

コメンターの1で述べたように、注釈はクラスのみに継承します。詳細については、java docsを参照してください。

私が本当に探しているのは、メソッドのための "isAssignableFrom"、またはメソッドのシグネチャを簡単に比較する方法です。

ありがとうございました。

+0

コードであることを... –

+0

コードを整形して、文字化けが少なくなるように編集しました:-) –

+0

whoops - それはプレビューで文字化けしていませんでした - それをさせてください – aperkins

答えて

3

最も簡単(なし、うまく実行するつもりはないが、おそらくそれはあなたがこのような場合には気にしたいものではないのです)の方法は、concreteClass.getMethod()を呼び出すことです:

Method interfaceMethod = ...; // method whose implementation you're looking for 
try { 
    Method implementationMethod = concreteClass.getMethod(
     interfaceMethod.getName(), interfaceMethod.getParameterTypes()); 
} catch (NoSuchMethodException E) { 
    // your class may be abstract and thus would not implement given method 
} catch (SecurityException E) { 
    // insufficient permissions 
} 
+0

ありがとうございます - これはとてもうまくいくでしょう。また、パフォーマンスのために、必要に応じてコールをキャッシュすることができるため、ヒット・ヒットが1回発生するだけです。私はこれを忘れたとは信じられません:) – aperkins

0

メソッドはequalsを実装していますので、呼び出すことができます。定義はあなたがしていることとは少し異なります。あなたが書いているロジックに特に従うことが必要な場合は、AFAIKを自分のものにする必要があります。これを行うには

+0

ええ、equalsはシグネチャをチェックしません。同じクラスのメソッドであり、同じメソッドであり、同じクラスローダによってロードされたということだけです。私は本当にそれが別のメソッドの実装であるかどうかを知りたい、つまりオーバーライドです。 – aperkins