当前位置: 首页 > 面试题库 >

Java超类中的常规调用私有方法

华森
2023-03-14
问题内容

我有一个MyAbstractClass带有私有方法的抽象Java类。有一个具体的实现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这样的东西之外)?

谢谢杰夫


问题答案:

您可以调用私有方法的事实是Groovy语言中的错误,而不是功能。但是,我相信在对闭包的行为方式进行一些更改时,故意引入此错误是一种折衷形式。

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

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

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

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

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

new Child().bar()


 类似资料:
  • 我想用PHP在我的简单ORM中实现一个钩子系统: 这会导致一个致命错误: 致命错误:调用私人方法付款::before_save()从上下文'记录'中 有道理。 我可以将范围更改为public,但这似乎很难看:在保存()之前,除了支付之外,没有人与

  • 问题内容: 我有一个具有称为的私有方法的类。我想从外面打电话。我认为应该可以反思,但是我得到了。有任何想法吗??? 问题答案: 利用使用其之前的Method对象的方法。

  • 问题内容: 我正在学习Java入门课程,我们才刚刚开始学习继承。我正在完成一项任务,要求我们创建一个具有名称和年龄的“宠物”超类。和三个子类,每个子类都有自己的独特特征(我选择了“狗”,“猫”和“鸟”)。构建完所有这些之后,我们将创建一个Main类来测试所有内容,这就是我遇到问题的地方。我试图在中调用这些独特特征的方法,但似乎只能找到超类中的方法。 这是主类: 这是我的超人 这是子类之一(它们看起

  • 问题内容: 假设我有以下两个课程 如果我启动一个beta类型的新对象,如何执行在alpha类而不是beta中找到的逻辑?我可以使用<-我想知道是否可行。 Eclipse IDE中的自动键入功能使我可以选择从class 或class中进行选择。 问题答案: 你可以做: 注意,这是对父级的引用,但是super()是它的构造函数。

  • 问题内容: 因此,此代码的输出为。现在,我想到了一个问题:作为 派生 类对象的 po 怎么能调用作为基类的 PrivateOverride 的私有方法? 问题答案: 因为您在类中定义了main方法。如果将main方法放在Derived类中,它将无法编译,因为在该类中不可见。 class中的po.f()调用不是多态的,因为in 类为,所以in class中的值不会被覆盖。