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

时间:2010-05-14 14:03:45

标签: java groovy methods private

我有一个带有私有方法的抽象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 个答案:

答案 0 :(得分:9)

您可以调用私有方法的事实是a bug in the Groovy language,而非功能。但是,我认为在对闭包行为进行一些更改时,故意将此错误作为一种妥协方式引入。

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

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

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

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

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

new Child().bar()