使用超类私有成员(Java)

使用超类私有成员(Java),java,inheritance,Java,Inheritance,我已经从Java中的一个类构建了一个子类,这个类有我想在子类中访问的私有方法,我不能更改或编辑这个超类。问题当然是它们是私人的。假设我自己编写了超类,并且有某些原因说明这些方法必须是私有的。我可以复制子类中的代码。但是,在编写子类时,有没有更好的方法(不产生那么多代码行)能够使用它们呢 使超类方法的受保护。它只能从子类和包中访问 private修饰符只能在类中访问 因此您尝试使用“extends”从超类继承方法。当然它们是私有的,但是您可以在子类中使用它们。将它们抽象化会迫使您私下重写每一个方法

我已经从Java中的一个类构建了一个子类,这个类有我想在子类中访问的私有方法,我不能更改或编辑这个超类。问题当然是它们是私人的。假设我自己编写了超类,并且有某些原因说明这些方法必须是私有的。我可以复制子类中的代码。但是,在编写子类时,有没有更好的方法(不产生那么多代码行)能够使用它们呢

使超类方法的
受保护
。它只能从
子类和包中访问


private
修饰符只能在类中访问

因此您尝试使用“extends”从超类继承方法。当然它们是私有的,但是您可以在子类中使用它们。将它们抽象化会迫使您私下重写每一个方法,我看不到其他选择。

在您的情况下,您应该将私有方法声明为受保护。阅读此主题的更多详细信息。

忽略您想要这样做的原因可能非常糟糕(没有使用私有变量的合同,因此无法保证它们不会更改或完全消失!)您可能可以使用反射来做您想做的事:

使用:
)
)
)


我想强调的是,你应该考虑做这件事的原因,并决定反对它!如果您拥有正在扩展的代码,请考虑是否应该使用字段<代码>保护< /代码>而不是<代码>私有< /代码>。请记住,挂接到您不应该访问的代码会破坏OOP原则(您正在规避封装),并且无法保证您的应用程序所依赖的代码不会在库的更新中消失(因此您也将自己锁定到库的固定版本).

哪些特定原因限制您使用
protected
而不是
private
方法?使用“假设我自己编写了超类…”我想表明我有代码。超类来自大型库,因此无法更改访问权限。不,此语句并不表示您希望这样说。在这种情况下,从超类复制方法,这些方法是私有的,这是有原因的。API开发人员会毫不犹豫地在即将发布的版本中更改或删除私有方法。事实上,我还没有编写超类。我不允许更改声明。我只是想表明我有代码。在你的问题中,不允许你更改声明的事实并不清楚。既然您说“假设我自己编写了超类,并且这些方法必须是私有的,有一定的原因”,那么这将表明这些方法只与超类相关,在这种情况下,这些方法本质上不应该扩展。在子类中创建一个新的就可以了,除非您真的需要相同的方法体!这意味着必须重新考虑设计!非私有字段是个坏主意。我不知道java中的反射(它在待办事项列表上),但它看起来令人惊讶的无政府主义。但在我的例子中,我认为最好复制子类中的私有内容,并获得一些不灵活的特性。我猜从给定库超类继承并不总是该库的开发人员想要的。这几乎像是黑客入侵。同意,你要小心行事。有时候,如果我开始沿着这样一条路走下去,我会花一点时间退一步,重新考虑我真正想要实现的目标,并评估我所走的道路到底是不是最好的。
Class c = object.getClass();
Field field = c.getDeclaredField("somePrivateInstanceVariable");
field.setAccessible(true);
Object someValue = field.get(object);