我已经从 Java 中的一个类构建了一个子类,该类具有我想在子类中访问的私有方法,我无法更改或编辑超类。问题当然是他们是私人的。假设我自己编写了超类,并且出于某些原因,这些方法必须是私有的。我可以复制子类中的代码。但是在编写子类时有没有更好的方法(不产生这么多代码行)来使用它们?
4 回答
忽略您想要这样做的原因可能非常糟糕(您没有使用私有变量的合同,因此无法保证它们不会改变或完全消失!)您可能可以使用反射做您想做的事:
使用:
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.语言.对象)
Class c = object.getClass();
Field field = c.getDeclaredField("somePrivateInstanceVariable");
field.setAccessible(true);
Object someValue = field.get(object);
我只是想强调一下,你应该考虑这样做的原因并决定反对它!如果您拥有要扩展的代码,请考虑是否应该改为使用该字段protected
而不是private
. 请记住,挂钩到您不应该访问破坏 OOP 原则的代码(您正在规避封装)并且不能保证您的应用程序所依赖的代码不会在库的更新中消失(所以您是也将自己锁定到lib的固定版本)。
制作超类方法的protected
. 它只能从sub-class
包中访问。
private
修饰符只能在类中访问。
因此,您尝试使用“扩展”从超类继承方法。当然它们是私有的,但你可以在 sublass 中使用它们。使它们抽象会迫使您私下重写每一个,我看不到其他选择。
在您的情况下,您应该将私有方法声明为受保护。阅读此内容以获取有关该主题的更多详细信息。