2016-04-06 22 views
3

JAXB ek açıklamalarına sahip bir sınıfım var. Sınıfın zorunlu özellikleri, ek açıklama @XmlElement öğesine (gerekli = true) sahiptir. Sınıfın bir nesnesini, aynı sınıfın başka bir nesnesine kopyalamak için bir yol var mı, böylece yalnızca gereken özellikler kopyalanacak ve isteğe bağlı olanlar boş bırakılacak mı?JAXB: yalnızca nesne için gerekli özellikleri kopyala

sayesinde

Güncelleme: Ben, genel bir çözüm arıyorum olduğunu açıklamak gerektiğini düşünüyorum yani sınıf ve önceden özelliklerini bilerek gerektirmez biri.

+3

Sanırım kendi 'copy() yönteminizi yazmanız gerekiyor – Dimi

+1

Evet, var. Ya, @Dimi'nin önerdiği gibi kendi yönteminizi yazın ya da bunu genel olarak yapmak istiyorsanız, yansımayı kullanın (bu iyi bir uygulama değildir). – f1sh

+0

Bu gibi bir örneği örnek olarak verebilir misiniz()? – spoonboy

cevap

2

kopya() yönteminin bir örnek:

class YourJaxbClass { 
    @XmlElement(required = true) 
    private String property1; 

    @XmlElement //this one is not required 
    private String property2; 

    public YourJaxbClass copy(){ 
    YourJaxbClass copy = new YourJaxbClass(); 
    //only copy the required values: 
    copy.property1 = this.property1; 
    return copy; 
    } 
} 

... ve yansıma kullanarak jenerik versiyon:

static class JaxbUtil { 
    static <T> T copy(Class<T> cls, T obj) throws InstantiationException, IllegalAccessException{ 
    T copy = cls.newInstance(); 
    for(Field f:cls.getDeclaredFields()){ 
     XmlElement annotation = f.getAnnotation(XmlElement.class); 
     if(annotation != null && annotation.required()){ 
     f.setAccessible(true); 
     f.set(copy, f.get(obj)); 
     } 
    } 
    return copy; 
    } 
} 

ben bu cesareti olabilir neden yaşarsın. Bunu şu şekilde kullanın:

YourJaxbClass theCopy = JaxbUtil.copy(YourJaxbClass.class, yourObjectToBeCopied); 
+0

f.set üzerinde bir istisna alıyorum (... JaxbUtil ile "korumalı" değiştiricilerle MyTest Type sınıfının bir üyesine erişim sağlayamıyor. Korunan özellikler ile çalışacak şekilde değiştirilebiliyor mu? Geters/setters? – spoonboy

+0

'setAccessible (true); – f1sh