代码之家  ›  专栏  ›  技术社区  ›  Jeff Storey

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

  •  4
  • Jeff Storey  · 技术社区  · 14 年前

    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之类的东西)?

    谢谢 杰夫

    1 回复  |  直到 14 年前
        1
  •  10
  •   Dónal    14 年前

    您可以调用私有方法的事实是 a bug in the Groovy language ,不是功能。但是,我相信这个bug是在对闭包的行为方式进行一些更改时故意引入的,作为一种妥协。

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

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

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

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