Как я могу мелко клонировать экземпляр, который не реализует Cloneable?

Моя структура обрабатывает доменные объекты любого класса. Мне нужно иметь возможность клонировать такой экземпляр объекта домена fooкак бы это реализовано Cloneable (что это не так), и я позвонил Object.clone() на нем, который возвращает мелкий клон.

Вещи, которые НЕ работают:

  • Заставить класс foo реализовать Cloneable и для этого публичный метод clone(),
  • Через рефлексию вызовите foo.clone() (чтобы добраться до защищенного метода Object.clone()). Это бросает CloneNotSupportedException так как fooКласс не реализует Cloneable,
  • Сериализация и десериализация foo: мне нужна мелкая копия, а не глубокая.

Ограничения:

  • fooКласс не знаю во время компиляции.
  • foo может иметь поле, которое не отображается как получатель / установщик.

Примечание: есть пара похожих вопросов, но ни один из них, похоже, не фокусируется на получении мелкого клона.

2 ответа

Решение

BeanUtils может клонировать не клонируемые Бины, если у них есть сеттеры / получатели. К сожалению, Orika bean mapper также не поддерживает отображение приватных полей.

В конце концов, вам будет проще реализовать его на основе собственных размышлений (как предполагает hoaz), поскольку большинство библиотек для отображения bean-компонентов пытаются выполнять глубокие копии, и у вас, кажется, есть некоторые особые требования (такие как поддержка для копирования приватных полей).

class A{
    private int a;
    private int[] b;


    public int getA() {
        return a;
    }
    public void setA(int a) {
        this.a = a;
    }
    public int[] getB() {
        return b;
    }
    public void setB(int[] b) {
        this.b = b;
    }

    public static A shallowCopyOf(A instanceOfA){ //performs shallow copy
        A newInstance  = new A();
        newInstance.setA(instanceOfA.getA());
        newInstance.setB(instanceOfA.getB());
        return newInstance;
    }
}
Другие вопросы по тегам