如何调用从孩子父母的私有方法? [重复](How to invoke parent privat

2019-08-07 07:28发布

这个问题已经在这里有一个答案:

  • 派生类如何调用基类的私有方法? 7个回答
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的事情吗?

Answer 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();
        }
    }
}


Answer 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;
    }
}


Answer 3:

你应该声明GETC保护。 这正是它是。

至于反思:是的,这是可能的。 你不得不虽然调用setAccessible方法对象。 它是坏的风格... ;-)



Answer 4:

getDeclaredMethod只会返回当前类不是继承方法的私有方法。 为了实现这一目标,需要通过getSuperclass之类的方法来导航继承图。 下面的代码片段,做它

  private Method getPrivateMethod(Object currentObject) throws NoSuchMethodException, IllegalAccessException, IllegalArgumentException, InvocationTargetException {
  Class<?> currentClass = currentObject.getClass();
  Method method = null;
  while (currentClass != null && method == null) {
      try {
          method = currentClass.getDeclaredMethod("getC");
      } catch (NoSuchMethodException nsme) {
          // method not present - try super class
          currentClass = currentClass.getSuperclass();
      }
  }
  if (method != null) {
      method.setAccessible(true);
      return method;
  } else {
      throw new NoSuchMethodException();
  }

}



Answer 5:

你可以尝试这样的使用反射:

    Method getCMethod = A.class.getDeclaredMethod("getC");
    getCMethod.setAccessible(true);
    getCMethod.invoke(new A());


文章来源: How to invoke parent private method from child? [duplicate]