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

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

 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这样的东西)?

谢谢Jeff

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

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

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

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

 class Parent { private foo() {println "foo"} } class Child extends Parent { public bar() {super.foo()} } new Child().bar()