使用超类私有成员(Java)

时间:2013-01-13 10:44:37

标签: java inheritance

我已经从Java中的类构建了一个子类,该类具有我想要在子类中访问的私有方法,我无法更改或编辑超类。问题当然是私人的。假设我自己编写了超类,并且有一些理由说明为什么这些方法必须是私有的。我可以复制子类中的代码。但是在编写子类时是否有更好的方法(没有生成如此多的代码行)来使用它们?

4 个答案:

答案 0 :(得分:0)

制作超类方法的protected。它只能从sub-class和包中访问。

private修饰符只能在课堂上访问。

答案 1 :(得分:0)

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

答案 2 :(得分:0)

忽略你想要这样做的原因可能非常糟糕(你没有使用私有变量的合约,因此无法保证它们不会改变或完全消失!)你可能做的就是你想要反思:

使用:
http://docs.oracle.com/javase/6/docs/api/java/lang/Class.html#getDeclaredField(java.lang.String
http://docs.oracle.com/javase/6/docs/api/java/lang/reflect/AccessibleObject.html#setAccessible(boolean
http://docs.oracle.com/javase/6/docs/api/java/lang/reflect/Field.html#get(java.lang.Object

Class c = object.getClass();
Field field = c.getDeclaredField("somePrivateInstanceVariable");
field.setAccessible(true);
Object someValue = field.get(object);

我只想强调你应该考虑这样做的原因并做出决定!如果您拥有要扩展的代码,请考虑是否应该使用字段protected而不是private。请记住,挂钩代码你不应该有权破坏OOP原则(你正在绕过封装)并且无法保证你的应用程序所依赖的代码不会在库的更新中消失(所以你是还将自己锁定到lib的固定版本。)

答案 3 :(得分:-1)

在您的情况下,您应该将私有方法声明为受保护。请阅读this了解有关此主题的更多详情。