2

Methodインターフェイス定義のMethodインスタンスと実装クラスの同じメソッドのインスタンスがある状況に遭遇しました。

例えば:

public interface Foo {
    void bar();
}

public class FooImpl implements Foo {
    public void bar() {
        System.out.println("foobar");
    }
}

リフレクションを使用して、インターフェイスからMethodインスタンスを取得し、から派生した実装を取得しました。基本的に、私はこれらを同等と見なす必要がありますが、明らかにこの方法はそれらが同等ではないことを示しています。barFooFooImplMethodsequals

具体的には、Methodリフレクションを通じて取得された特定のものがスーパークラス/インターフェイスをオーバーライドするかどうかを判断する方法が必要Methodです。

私は現在、特定のクラスから「最小派生」メソッドを見つけることによって状況を完全に回避する回避策を使用していますが、より洗練された解決策があるかどうか疑問に思っています。

4

1 に答える 1

0

equalsメソッドでは修飾子を考慮していませんが、このアルゴリズムを使用する場合は、これでかなり近づくはずです。

package test;

import java.lang.reflect.Method;
import java.util.ArrayList;
import java.util.List;

public class TestFooBar {
@SuppressWarnings("rawtypes")
public static void main(String[] args) {
    try {
        // Get the class of interest
        Class fooImpl = Class.forName("test.FooImpl");

        // Test all the methods
        for(Method m : fooImpl.getMethods()) {
            boolean overriden = false;
            List<Class> parents = new ArrayList<Class>();
            for(Class c : fooImpl.getInterfaces()) {
                parents.add(c);
            }
            if(fooImpl.getSuperclass() != null) parents.add(fooImpl.getSuperclass());
            for(Class c : fooImpl.getInterfaces()) {
                for(Method sm : c.getMethods()) {
                    if(equals(sm, m)) {
                        overriden = true;
                        break;
                    }
                }
                if(overriden) break;
            }
            System.out.println(m+": "+(overriden ? "Overriden" : "Not overriden"));
        }
    }
    catch(Exception e) {
        e.printStackTrace();
    }
}

private static boolean equals(Method m1, Method m2) {
    if(!m1.getName().equals(m2.getName())) return false;
    String t1 = "";
    for(Class c : m1.getParameterTypes()) {
        t1+=c.getName()+"/";
    }
    String t2 = "";
    for(Class c : m2.getParameterTypes()) {
        t2+=c.getName()+"/";
    }
    if(!t1.equals(t2)) return false;

    return true;
}
}
于 2012-07-16T19:41:54.423 に答える