2013-03-07 6 views
10

これは可能ですか?私が見つけたリフレクションを使用して別のメソッドをオーバーライドするかどうかを判断しますか?

唯一の解決策は、通常Class BClass Aから割り当て可能である場合にオーバーライドなどの方法を検討し、Method AMethod Bと同じシグネチャを持っている場合。しかし、それはすべてのケースをカバーしていない!

interface Foo<T> { 
    void doStuff(T arg);  
} 

class FooImpl implements Foo<String> { 
    public void doStuff(String args) { 
     //Is overriden! 
    } 
} 

私もMethod BMethod A(パッケージスコープなど)に実際に表示されていることを確認したい:

は例えば、私はこのケースを処理します。

メソッドがオーバーライドされているかどうかを判断する信頼できる方法を体験したことがありますか?

あなたは

+1

'@ Overridable'オプションの注釈を忘れないでください。 –

答えて

3

関与なしジェネリック医薬品が存在しない場合、メソッドはオーバーライドされているかどうかを判断するexisting answerがありますありがとうございます。

Javaは、type erasureのためにジェネリックタイプを完全に削除します。したがって、バイトコードは次のようになります。

class FooImpl implements Foo<java.lang.String> { 
    FooImpl(); 
    Code: 
     0: aload_0 
     1: invokespecial #10     // Method java/lang/Object."<init>":()V 
     4: return 

    public void doStuff(java.lang.String); 
    Code: 
     0: return 

    public void doStuff(java.lang.Object); 
    Code: 
     0: aload_0 
     1: aload_1 
     2: checkcast  #21     // class java/lang/String 
     5: invokevirtual #23     // Method doStuff:(Ljava/lang/String;)V 
     8: return 
} 

doStuffメソッドが2つあります。それはbridge methodです。実際にはvoid doStuff(java.lang.String)はオーバーライドされませんしかし、void doStuff(java.lang.Object)はです。

Foo foo = new FooImpl(); 
foo.doStuff("ABC") 

実際にはvoid doStuff(java.lang.Object)を呼び出します。したがって、上記のリンクを使用してvoid doStuff(java.lang.Object)がオーバーライドされているかどうかを検出すると、yesとレポートされます。

public static void main(java.lang.String[]); 
    Code: 
     0: new   #1     // class FooImpl 
     3: dup 
     4: invokespecial #22     // Method "<init>":()V 
     7: astore_1 
     8: aload_1 
     9: ldc   #23     // String ABC 
     11: invokeinterface #25, 2   // InterfaceMethod Foo.doStuff:(Ljava/lang/Object;)V 
     16: return 
+0

答えを更新しました。 @ user1642427 – StarPinkER

+0

非常に参考になりました。ありがとうございました!私はそれを行うことができるライブラリを見つけられなかったので、これを自分で実装するつもりです。それがエレガントで短い解決策で終わるなら、私はここにそれを掲示するでしょう。 –

+0

私はちょうど私の解決策をここに掲載しました(Kotlinで書かれています):http://stackoverflow.com/questions/4821704/java-how-to-find-if-a-method-is-overridden-from-base-class –

関連する問題