java - 验证成员变量是否实现了clone()方法

标签 java object

我正在尝试创建作为参数传递的数据对象的副本,并将其分配给以下类中的数据成员变量(包括我迄今为止尝试过的内容)

public abstract class AbstractVertex implements Vertex {
private String label;
private Object data;

public AbstractVertex(String label, Object data) {
    this.label = label;

    //What I've tried so far :
    //Method #1
    if(!(data instanceof Cloneable)){
        throw new RuntimeException("data's class doesn't implement a custom clone method");
    }
    this.data = data.clone();

    //Method #2 (Just to get the idea behind this method, syntax may be completely wrong)
    if(( data.getClass().getMethod(clone()) ) == null){
        throw new RuntimeException("data's class doesn't implement a custom clone method");
    }
  }
}

所以我的问题是我无法实现这些方法中的任何一个,因为 Object 类中的 clone() 方法受到保护。但由于我需要能够在 AbstractVertex 类中存储任何类型的数据,因此我绝对必须确保存储的 data 实际上是传入数据的副本参数并且不通过引用传递。

那么,我该如何解决这个问题呢?

注意:这是抽象类,继承类将使用这个构造函数。

最佳答案

首先你的方法2是错误的,不仅语法错误,而且逻辑错误。在java中,每个类都是Object的子类,并且由于Object有一个 protected clone()方法,无论它们是否实现Cloneable code> 或并非每个类都有 protected clone() 方法。因此 someObject.getClassc().getMethod("clone") 永远不会返回 null

对于方法 1,由于 clone() 方法受到保护,因此您需要使用反射来调用它,如下所示;

    //Method #1
    if(!(data instanceof Cloneable)){
        throw new RuntimeException("data's class doesn't implement a custom clone method");
    }
    Method cloneMethod = data.getClass().getMethod("clone");
    this.data = cloneMethod.invoke(data);

我认为你应该看看这个问题:About Java cloneable 。像链接中提到的那样使用深克隆和浅克隆是您应该实现的做法。

关于java - 验证成员变量是否实现了clone()方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37902941/

相关文章:

java - 捕获框架内的按键

java - 如何使用 Android 注释通过 Intent 获取额外数据?

python - Python 中的字符串到对象

javascript - 是否可以在 JavaScript 中的对象中创建动态键?

javascript - 是否有 Object.keys.map 的简写

java - While 循环覆盖其他输入

java - 无法在 Android 的 HTTP 请求中获取 JSON

java - 为什么这段代码片段中的 lambda 更好?

javascript - 对象处理的 localStorage 数组

c++ - 像测试指针一样测试 C++ 对象的有效性