Java 任何使用反射攻击类字段的设计模式

Java 任何使用反射攻击类字段的设计模式,java,design-patterns,Java,Design Patterns,我有第三方数据模型类,其中一些字段和方法是私有的。我希望hack这个类包装这些私有字段,以便外部访问 例如,数据模型是defaultModel.java。我想扩展它来创建一个子类RefineddefaultModel.java,它通过使用java反射来包装它的私有字段 有什么好的设计模式可以做到这一点吗 因为我觉得只有在我的班级里才能反映出这一点,这并不是最好的做法 有什么好的设计模式可以做到这一点吗 不

我有第三方数据模型类,其中一些字段和方法是私有的。我希望hack这个类包装这些私有字段,以便外部访问

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

有什么好的设计模式可以做到这一点吗

因为我觉得只有在我的班级里才能反映出这一点,这并不是最好的做法

有什么好的设计模式可以做到这一点吗


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

// Possible but horrible:
Field field = object.getClass().getDeclaredField("privateField");
field.setAccessible(true);
oldValue = field.get(object);
field.set(object, newValue);
如果你不想让事情完全失控,那就只做“得到”而不做“设定”。我将进一步避免扩展对象和弄乱类结构。为此,您可以使用使用组合的适配器模式

如果任何字段是最终字段,则可能会遇到其他问题。见现有问题: . 你也可以看到


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

如果您正在使用反射修改私有字段,那么您已经处于“非最佳实践”的领域。我同意Jon Skeet的观点,如果该类的设计不是为了重写或隐藏子类的某些数据,那么最佳实践是不攻击该类。此外,还有很多情况可能会破坏您的代码,例如SecurityManager不允许访问这些字段、基类未来版本的更改等。也许您可以详细说明一下您的实际目标是什么。我相信在您的具体案例中会有更好的设计选择。我知道这不是最佳实践,但我不得不这么做,我想知道基于此的最佳实践是什么我同意Jon&Thomas的观点。但是,您可以使用来修改类本身,并为这些变量添加getter和setter。它是用于几个代理库的幕后工具。