【问题标题】:How to clone an Object without knowing the exact type in Java?如何在不知道 Java 中确切类型的情况下克隆对象?
【发布时间】:2018-05-27 16:02:31
【问题描述】:
public void test(Object obj){`
      Object newObj = obj;//reference

}

在不知道 obj 的确切类型的情况下,我如何克隆它,例如 Object newObj = obj.clone();Object newObj = new Object(obj);

实际情况是:在一个类Message中我设置了一个成员HashMap<String,Object>,让任何想使用Message的人都可以添加其他属性/成员而不是重写它。该对象可能是ArrarList<Integer>。问题来了。

【问题讨论】:

  • 如果你不知道一个对象是什么,为什么你认为克隆它是有用的?
  • 我注意到您的问题仍然是“开放的”:您没有接受答案。请查看并决定是否要accept 回答。或者让我知道我是否可以做些什么来增强我的输入以使其被接受。接受有助于未来的读者确定问题是否已解决,并对花时间回答你的人表示感谢。

标签: java object clone


【解决方案1】:

一种安全的方法是序列化对象,然后反序列化。这确保了一切都是全新的参考。您必须实现Serializable 接口。

Google commons class org.apache.commons.lang.SerializationUtils通过以下方法为您提供:

SerializationUtils.clone(Object);

例子:

this.myObjectCloned = SerializationUtils.clone(this.object);

【讨论】:

  • 但在这种情况下 object instanceof java.io.Serializable 必须返回 true
  • 除了这要求对象是可序列化的。即使是这样 - 也无法保证完整的内部状态将被序列化。
  • @lukaslew 我在答案You'll have to implement the Serializable interface.中引用了同样的内容@
  • @GhostCat 是的,我在答案中提到了序列化条款。 You'll have to implement the Serializable interface.。此外,可能有一些例外情况它不起作用,但它应该涵盖相当大比例的用例。如果 OP 提到任何特定情况,我们可以解决它们。
  • 实际情况是:在一个类Message中我设置了一个成员HashMap<String,Object>,让任何想使用Message的人都可以添加其他属性/成员而不是重写它。这里一个对象可能是ArrarList<Integer>。问题来了。
【解决方案2】:

简单:你不能那样做。

除非您知道您将处理/遇到的所有对象都遵循某些规则,例如它们允许序列化。

【讨论】:

    猜你喜欢
    • 2011-04-01
    • 2017-01-18
    • 1970-01-01
    • 2017-12-04
    • 1970-01-01
    • 1970-01-01
    • 2014-04-19
    • 2016-07-19
    • 1970-01-01
    相关资源
    最近更新 更多