我可以在Java中重写私有方法吗?

我知道我可以使用反射来调用私有方法,并获取或设置私有变量的值,但我想重写一个方法。

public class SuperClass {

    public void printInt() {
        System.out.println("I am " + getClass() + ". The int is " + getInt());
    }

    private int getInt() {
        return 1;
    }
}

public class SubClass extends SuperClass {

    public static void main(String[] args) {
        (new SubClass()).printInt();
    }

    public int getInt() {
        return 2;
    }
}

我希望方法打印出来,但它打印出来。我听说这可以通过反思来完成,但我不知道该怎么做。如果不是反思,有没有人知道另一种方法?(除了使受保护或将方法复制并粘贴到 .)如果实际上无法重写私有方法,那么是否有一种方法可以在其上放置某种触发器,以便在私有方法执行之前或之后调用我的子类中的方法?mainSubClass21SuperClass.getInt()printInt()SubClass


答案 1

不能重写私有方法,因为没有其他类(包括派生类)可以判断它是否存在。这是私人的

私有方法是隐式的。final

在相关的说明中,子类可以声明与超类中的字段或方法同名的字段或方法,因为从子类的角度来看,这些成员不存在。这些成员之间没有特殊的关系。private


答案 2

私有方法不会被继承,并且不能以任何方式重写。谁告诉你你可以用反思来做到这一点,要么是在撒谎,要么是在谈论别的事情。

但是,您可以访问正在调用的任何子类的私有方法,如下所示:getIntprintInt

public void printInt() throws Exception {
    Class<? extends SuperClass> clazz = getClass();
    System.out.println("I am " + clazz + ". The int is " +
                       clazz.getMethod("getInt").invoke(this) );
}

这将产生从超类调用子类的方法的效果。当然,如果子类声明 ,现在这将失败,因此您必须添加检查才能处理不尝试“覆盖”私有方法的“正常”子类:getIntprintIntgetInt

public void printInt() throws Exception {
    Class<? extends SuperClass> clazz = getClass();

    // Use superclass method by default
    Method theGetInt = SuperClass.class.getDeclaredMethod("getInt");

    // Look for a subclass method
    Class<?> classWithGetInt = clazz;
    OUTER: while( classWithGetInt != SuperClass.class ){

        for( Method method : classWithGetInt.getDeclaredMethods() )
            if( method.getName().equals("getInt") && method.getParameterTypes().length == 0 ){
                theGetInt = method;
                break OUTER;
            }

        // Check superclass if not found
        classWithGetInt = classWithGetInt.getSuperclass();
    }

    System.out.println("I am " + classWithGetInt + ". The int is " + theGetInt.invoke(this) );
}

您仍然必须更改超类代码才能使此操作正常工作,并且由于您必须更改超类代码,因此只需将访问修饰符更改为,而不是进行反射黑客攻击。getIntprotected