Подтвердить что ты не робот

Как вызвать родительский частный метод из дочернего?

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?

4b9b3361

Ответ 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;
    }
}

Ответ 3

Вы должны объявить getc защищенным. Это именно то, ради чего.

Что касается отражения: Да, это возможно. Однако вам придется вызвать setAccessible на объект метода. И это плохой стиль...; -)

Ответ 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();
  }

}

Ответ 5

вы можете попробовать это, используя отражение:

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