在Java超类中使用groovy调用私有方法

Jef*_*rey 4 java methods groovy private

我有一个MyAbstractClass带私有方法的抽象Java类.有一个具体的实施MyConcreteClass.

public class MyAbstractClass {
    private void somePrivateMethod();
}

public class MyConcreteClass extends MyAbstractClass {
      // implementation details
}
Run Code Online (Sandbox Code Playgroud)

在我的常规测试课中,我有

class MyAbstractClassTest {

    void myTestMethod() {
        MyAbstractClass mac = new MyConcreteClass()
        mac.somePrivateMethod()
    }
}
Run Code Online (Sandbox Code Playgroud)

我得到一个错误,即somePrivateMethod没有这样的方法签名.我知道groovy可以调用私有方法,但我猜测问题是私有方法是在超类中,而不是MyConcreteClass.有没有办法像这样调用超类中的私有方法(除了使用像PrivateAccessor这样的东西)?

谢谢Jeff

Dón*_*nal 9

您可以调用私有方法的事实是Groovy语言中的错误,而不是一个功能.但是,我认为在对闭包行为进行一些更改时,故意将此错误作为一种妥协方式引入.

即使你可以调用私有方法,你也不应该这样做,因为希望有一天这个bug会被修复,如果你的程序依赖于调用私有方法,那么它将被破坏.

如果你真的坚持(ab)使用这个未记录的行为,你可以尝试使用像ReflectionUtils这样的东西来调用父类中的私有方法.

另一种解决方法是在具体类中提供一个方法,该方法调用父类中的私有方法.例如,以下代码"有效",但仍依赖于访问私有成员,这很糟糕

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

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

new Child().bar()
Run Code Online (Sandbox Code Playgroud)

  • 同意100%.私人是私人的原因. (2认同)
  • 我看到你来自哪里,但如果你听过Neal Ford谈话,他实际上称这是一个功能,私有是java语言的一个特征,而不是java平台的特性 - 虽然我可以看到无论哪种方式.但不管你如何看待它,我认为它对测试中的有限情况很有用.我只在需要调用PrivateAccessor(或ReflectionUtils)的地方使用它.在这种特殊情况下,我想执行一个私有的readResolve方法,以确保正确地重新初始化瞬态字段. (2认同)