Java超类中的groovy调用私有方法

Java超类中的groovy调用私有方法,java,groovy,methods,private,Java,Groovy,Methods,Private,我有一个带有私有方法的抽象Java类MyAbstractClass。有一个具体的实现MyConcreteClass public class MyAbstractClass { private void somePrivateMethod(); } public class MyConcreteClass extends MyAbstractClass { // implementation details } 在我的groovy测试类中 class MyAbstract

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

public class MyAbstractClass {
    private void somePrivateMethod();
}

public class MyConcreteClass extends MyAbstractClass {
      // implementation details
}
在我的groovy测试类中

class MyAbstractClassTest {

    void myTestMethod() {
        MyAbstractClass mac = new MyConcreteClass()
        mac.somePrivateMethod()
    }
}
我得到一个错误,即对于somePrivateMethod没有这样的方法签名。我知道groovy可以调用私有方法,但我猜问题在于私有方法在超类中,而不是
MyConcreteClass
。有没有一种方法可以像这样在超类中调用私有方法(除了使用PrivateAccessor之类的东西)

谢谢
Jeff

您可以调用私有方法,这不是一个特性。然而,我相信这个bug是在对闭包的行为方式进行一些更改时故意引入的,作为一种妥协形式

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

如果您确实坚持(ab)使用这种未记录的行为,您可以尝试在父类中使用类似于调用私有方法的东西

另一个解决方法是在具体类中提供一个调用父类中私有方法的方法。例如,下面的代码“有效”,但它仍然依赖于访问私有成员,这是不好的

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

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

new Child().bar()

100%同意。私密是有原因的。我知道你是从哪里来的,但如果你听过Neal Ford talk的话,他实际上称这是一个特性,私密是java语言的特性,而不是java平台的特性——尽管我可以从任何一个方面看出来。但不管您如何看待它,我认为它对于测试中的有限案例是有用的。我只在需要调用PrivateAccessor(或ReflectionUtils)的地方使用它。在这个特殊的例子中,我想执行一个私有的readResolve方法来确保临时字段被正确地重新初始化。我从来没有听说过Neal Ford,尽管我很想知道他是如何证明这一立场的。我认为认为这个特性是合理的,因为它被接受为Groovy JRA中的一个bug,在任何授权的地方(Groovy网站,Groovy Boots等)都没有被提到作为私下的预期行为。他是一个大的测试人员(在DeWortWorksWord的生产程序员和架构师)。但我确实理解它被报道为一个bug。但只要这没有被滥用,它实际上可以作为使用反射实用程序的快捷方式。我知道这在技术上是一个bug。我只是觉得他们很难在不引起各种兼容性问题的情况下成功地修复它。也许会有一个标志或其他东西来保持它的启用。