我需要检查一个方法是否被覆盖

时间:2015-06-12 21:09:20

标签: java inheritance methods reflection override

这是一个包含Java反射的新任务。 假设我有2个classe:

public class A{
   bool foo(){...}
}

public class B extends A{
   bool foo(){...}
}

假设我有一个接收Class<?>参数的函数,我想检查某些派生类中是否覆盖了foo,而不知道是否有,我该怎么做?

我读了一些关于同一主题的任务,提到了isBridge或getDeclaringclass,但无法弄清楚那些是什么。

我必须提到我并不了解Java。这是我所采用的面向对象编程课程的一部分,所以它并不是要让我们成为Java专家,而是要展示这些原理。这意味着我的问题的解决方案不应该太复杂。

1 个答案:

答案 0 :(得分:1)

假设:

class A 
    {
        public void foo()
        {
            System.out.println("Ok on A");
        }
    }
    class B extends A
    {
        public void foo()           
        {
            System.out.println("Ok on B");
        }
    }

您可以遍历搜索方法

的类的层次结构树
String methodName="foo";
Class currentClass=B.class.getSuperclass();
boolean overwritten=false;
while(currentClass!=Object.class && !overwritten)
{
    try
    {
        Method m=currentClass.getMethod(methodName);
        overwritten=true;
        break;
    }
    catch (NoSuchMethodException e) {
        // Method does not exists
    } catch (SecurityException e) {
        // Security exception
    }
    currentClass=currentClass.getSuperclass();
}

如果覆盖为真,我们在某个父类中找到了该方法。

注意我们正在检查没有参数的方法(foo),要查找带参数的方法,你必须在getMethod调用中将它们指定为第二个参数。

现在,如果你想找到&#34;任何类&#34;已覆盖foo方法,您必须扫描类路径中的所有类,搜索它们是否包含目标方法,并为每个类执行相同的测试,或使用像org.reflections这样的反射库,您可以找到更多以下帖子中关于子类查找的信息:how-do-you-find-all-subclasses-of-a-given-class-in-java