如何从子代调用父私有方法?

2022-09-02 20:14:58
public class A{
    private int getC(){
        return 0;
    }
}

public class B extends A{
    public static void main(String args[]){
        B = new B();
        //here I need to invoke getC()
    }
}

你能告诉我是否可以通过java中的反射来做sush的事情吗?


答案 1
class A{
    
    private void a(){
        System.out.println("private of A called");
    }
}

class B extends A{
    
    public void callAa(){
        try {
            System.out.println(Arrays.toString(getClass().getSuperclass().getMethods()));
            Method m = getClass().getSuperclass().getDeclaredMethod("a", new Class<?>[]{});
            m.setAccessible(true);
            m.invoke(this, (Object[])null);
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

编辑:这是一个安静的旧帖子,但增加了一些建议

重新考虑您的设计

调用父级的私有方法,虽然可以通过反射,但不应该这样做。在父级上调用私有方法可能会使类处于无效状态,并可能导致意外行为。


答案 2

你可以使用反射来做到这一点,但除非有很好的理由这样做,否则你应该首先重新考虑你的设计。

下面的代码打印 123,即使从 A 外部调用也是如此。

public static void main(String[] args) throws Exception {
    Method m = A.class.getDeclaredMethod("getC");
    m.setAccessible(true); //bypasses the private modifier
    int i = (Integer) m.invoke(new A());
    System.out.println("i = " + i); //prints 123
}

public static class A {

    private int getC() {
        return 123;
    }
}