任何通过使用反射破解类字段的设计模式

时间:2013-10-14 07:22:14

标签: java design-patterns

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

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

有没有好的设计模式呢?

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

1 个答案:

答案 0 :(得分:2)

  

有没有好的设计模式呢?

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


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

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

如果你想要的东西不会完全失控,那么只能做到并且从不做套装。我会进一步避免扩展对象和搞乱类结构。您可以使用组合使用适配器模式。

如果任何字段是最终字段,您可能会遇到其他问题。看到这个现有的问题: Changing private final fields via reflection。您还可以看到How do I read a private field in Java?

但我必须强调这一点:尽量避免这种情况,让自己的未来变得快乐。 :)