Groovy вызов частного метода в суперклассе Java - PullRequest
4 голосов
/ 14 мая 2010

У меня есть абстрактный класс Java MyAbstractClass с закрытым методом. Есть конкретная реализация MyConcreteClass.

public class MyAbstractClass {
    private void somePrivateMethod();
}

public class MyConcreteClass extends MyAbstractClass {
      // implementation details
}

В моем классном тестовом классе у меня

class MyAbstractClassTest {

    void myTestMethod() {
        MyAbstractClass mac = new MyConcreteClass()
        mac.somePrivateMethod()
    }
}

Я получаю сообщение об ошибке, что не существует такой сигнатуры метода для somePrivateMethod. Я знаю, что groovy может вызывать закрытые методы, но я предполагаю, что проблема в том, что закрытый метод находится в суперклассе, а не MyConcreteClass. Есть ли способ вызвать закрытый метод в суперклассе, как этот (кроме использования чего-то вроде PrivateAccessor)?

спасибо Джефф

1 Ответ

9 голосов
/ 14 мая 2010

Тот факт, что вы можете вызывать закрытые методы, - ошибка в языке Groovy , а не функция.Тем не менее, я считаю, что эта ошибка была преднамеренно введена как форма компромисса при внесении некоторых изменений в поведение замыканий.

Даже если вы можете вызывать закрытые методы, вы не должны этого делать, потому что, надеюсь, однажды эта ошибка будетисправлено, и если ваша программа полагается на вызов частных методов, она будет повреждена.

Если вы действительно настаиваете на (ab), используя это недокументированное поведение, вы можете попробовать использовать что-то вроде ReflectionUtils для вызоваЗакрытые методы в родительских классах.

Другой обходной путь - предоставить метод в конкретном классе, который вызывает закрытый метод в родительском классе.Например, следующий код «работает», но все равно полагается на доступ к закрытым членам, что плохо

class Parent {
  private foo() {println "foo"}
}

class Child extends Parent {
  public bar() {super.foo()}
}

new Child().bar()
...