2

我有 3rd 方数据模型类,其中一些字段和方法是私有的。我想破解这个类来包装这些私有字段以供外部访问。

例如,数据模型是 defaultModel.java。我想扩展它来创建一个子类RefineddefaultModel.java,它通过使用Java反射来包装它的私有字段。

有没有好的设计模式可以做到这一点?

因为我觉得只在我的子类中以某种方式反映它不是最佳实践。

4

1 回答 1

3

有没有好的设计模式可以做到这一点?

不!乱搞私有领域是万恶之源,所以没有什么办法。您可能(并且很可能会)违反类不变量和并发支持,冒与未来版本不兼容的风险,并且最终会在运行时出现许多意外行为。您需要这样做的事实表明您的设计或您使用库的方式存在严重问题。


如果你问:有可能以一种可怕的方式吗?答案是肯定的。你可以做这样的事情。

// Possible but horrible:
Field field = object.getClass().getDeclaredField("privateField");
field.setAccessible(true);
oldValue = field.get(object);
field.set(object, newValue);

如果你想让事情不完全失控,只做gets,永远不要做sets。我会进一步避免扩展对象并弄乱类结构。您可以为此使用使用组合的适配器模式。

如果任何字段是最终的,您可能会遇到其他问题。请参阅这个现有问题: 通过反射更改私有最终字段。您还可以查看如何在 Java 中读取私有字段?

但我必须强调这一点:努力避免这种情况,让你未来的自己快乐。:)

于 2013-10-16T12:43:09.487 回答