Как я могу мелко клонировать экземпляр, который не реализует 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;
}
}