2014-10-24 5 views
0

Я хотел бы знать, как можно скопировать объект в Java. Но я имею в виду копирования без реализации Клонируемого интерфейса, но копировать уже существующий объект со всеми содержит другие объекты, например:Как скопировать нераскрытый объект?

JEditorPane editorOryginal = new JEditorPane(); 
editorOryginal.addFocusListener(new FocusAdapter() {}); 
editorOryginal.setText("Hello World!"); 
// ...... other setter and other listeners etc ..  

JEditorPane editorCopy = editorOryginal // now i only copy reference to editorOryginal 

//but i would like to get copy of object: 

JEditorPane editorCopy = editorOryginal.getCopyInstance();  
editorOryginal.destroy(); // in JEditorPane this method not exists but we assume existing this method 
editorCopy.something(); // here i have my copy but oryginal has been destroyed 
+0

поиск модели/XxxEditorKit – mKorbel

+0

, но мне нужно все не только EditorKit, компоненты, слушатели и т.д .. –

+0

Посмотрите на [Java глубокое клонирование] (http://code.google.com/p/cloning/) – Narmer

ответ

0

Там нет общего механизма для этого в Java. Чтобы класс разрешил копирование объектов, он должен реализовать механизм копирования (например, Cloneable).

В принципе, я полагаю, что можно было бы копировать объекты с помощью reflection, выбирая одного члена за один раз и создавая копию, но будет сложно заставить его работать. Обратите внимание, что это означает, что вам также нужно иметь доступ к закрытым членам. И даже если вам это удастся, нет никакой гарантии, что он будет работать, как вы ожидаете для классов, которые вы не контролируете ...

Рассмотрим это:

class A { 
    int i; 
} 

class B { 
    A a; 
} 

class C { 
    B b; 
} 

void f(C c) { 
    C c2 = c.getCopyInstance(); 

    // What is c2.b now? 
} 

Если c2.b быть такой же, как Сь (т.е. c2 является мелкой копией) или должна ли она быть новой копией cb (глубокая копия)? В некоторых случаях вам нужна глубокая копия, но для общих ресурсов (например, представляющих экран или диск) вы просто хотите назначить ссылку. Нет никакого способа в целом решить, как правильно копировать объект.

+0

Обратите внимание, что существуют уже существующие библиотеки, которые уже обрабатывают все это, например Apache BeanUtils. – chrylis

+0

Для общих объектов? Я предположил бы, например, что BeanUtils обрабатывают только бобы. Во всяком случае, я утверждаю, что нет никакого метода, который будет работать как предназначенный для всех видов объектов. – njlarsson

Смежные вопросы