有没有办法确定某个方法是否在 Java 类中被重写

2022-09-01 14:19:55

我希望能够确定基类方法是否已被子类覆盖,特别是因为在调用它之前需要昂贵的设置,并且我们系统中的大多数子类都不会覆盖它。是否可以使用反射提供的方法句柄对其进行测试?或者有没有其他方法来测试类方法是否被重写?

例如:

class BaseClass {
    void aMethod() { // don nothing }

    protected boolean aMethodHasBeenOverridden() {
        return( // determine if aMethod has been overridden by a subclass);
    } 
}

答案 1

您可以通过检查方法的声明类来使用反射来执行此操作:

class Base {
    public void foo() {}
    public void bar() {}
}
class Derived extends Base {
    @Override   
    public void bar() {}
}
...
Method mfoo = Derived.class.getMethod("foo");
boolean ovrFoo = mfoo.getDeclaringClass() != Base.class;
Method mbar = Derived.class.getMethod("bar");
boolean ovrBar = mbar.getDeclaringClass() != Base.class;
System.out.println("Have override for foo: "+ovrFoo);
System.out.println("Have override for bar: "+ovrBar);

指纹

Have override for foo: false
Have override for bar: true

演示。


答案 2

这可以完成调用 ,只有当 的类声明它时,才会返回某些东西。getClass().getDeclaredMethod("aMethod")this

下面是您的方法的实现:

/**
 * @return true if the instance's class overrode aMethod
 */
protected boolean aMethodHasBeenOverridden() {
    try {
        return getClass() != A.class && getClass().getDeclaredMethod("aMethod") != null;
    } catch (NoSuchMethodException | SecurityException e) {
        return false;
    }
}