【问题标题】:I need to check if a method is overridden我需要检查一个方法是否被覆盖
【发布时间】:2015-08-29 00:04:08
【问题描述】:

这是关于在 Java 中包含反射的硬件分配。 假设我有 2 节课:

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

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

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

我阅读了一些关于同一主题的问题,其中提到了 isBridge 或 getDeclaringclass,但无法弄清楚它们的作用。

我不得不提一下,我不太了解 Java。这是我正在学习的面向对象编程课程的一部分,因此它并不是要让我们成为 Java 专家,而是要展示其原理。这意味着我的问题的解决方案不应该太复杂。

【问题讨论】:

  • 如果需要使用反射,任何解决方案都会很复杂。
  • 方法是公开的还是包私有的,就像您的示例中一样?
  • 该方法可以是私有的或公共的或介于两者之间的任何方法。与一般的反射相比,我的意思是复杂的。整个作业都是关于反思
  • 你(或练习)所说的“在某些派生类中被覆盖”是什么意思?可以有任意数量的派生类,甚至在运行时添加,一般来说,在决定派生哪些类之前,您必须解决停机问题。如果没有明确给出作为参数的派生类,我认为这个问题没有意义。

标签: java inheritance methods reflection overriding


【解决方案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();
}

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

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

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

【讨论】:

  • 是的,你是对的,你必须测试每个父类是否包含相同的方法。
猜你喜欢
  • 1970-01-01
  • 2013-07-13
  • 1970-01-01
  • 2012-03-29
  • 2011-06-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多