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]?