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

Posted

技术标签:

【中文标题】Java超类中的groovy调用私有方法【英文标题】:groovy call private method in Java super class 【发布时间】:2011-02-19 13:16:18 【问题描述】:

我有一个带有私有方法的抽象 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 之类的东西)?

谢谢 杰夫

【问题讨论】:

【参考方案1】:

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

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

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

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

class Parent 
  private foo() println "foo"


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


new Child().bar()

【讨论】:

同意 100%。私人是私人的原因。 我知道你从哪里来,但如果你听过 Neal Ford 的谈话,他实际上称这是一个特性,而私有是 java 语言的特性,而不是java平台——虽然我可以看到它。但不管你怎么看,我认为它对测试中的有限情况很有用。我只在需要调用 PrivateAccessor(或 ReflectionUtils)的地方使用它。在这种特殊情况下,我想执行一个私有 readResolve 方法来确保正确重新初始化瞬态字段。 我从来没有听说过尼尔福特,虽然我很想听听他是如何证明这种立场的。我认为将其视为一个功能是不合理的,因为它已被认为是 Groovy JIRA 中的一个错误,并且在任何权威机构(Groovy 网站、Groovy 书籍等)中都没有将其视为私有的预期行为。跨度> 他是个测试大咖(《高效程序员》的作者和 ThoughtWorks 的架构师)。但我确实理解它被报告为一个错误。但只要不被滥用,它确实可以作为使用反射实用程序的捷径。 我知道这在技术上是一个错误。我只是发现他们很难成功地修复它而不会导致各种兼容性问题。也许会有一个标志或其他东西来保持它的启用。

以上是关于Java超类中的groovy调用私有方法的主要内容,如果未能解决你的问题,请参考以下文章

第六章 面向对象(高级篇)

iOS:UIView子类init会调用[super init]然后调用超类中的方法,为啥会调用[subclass initWithFrame:xx]?

2016年4月2日_JAVA学习笔记_下午

GroovyGroovy 脚本调用 ( Java 类中调用 Groovy 脚本 )

java中一个方法调用另一个方法。

Java核心第五章继承