2010-11-08 4 views
0

Je n'ai jamais vraiment utilisé la réflexion auparavant et je suis en train d'essayer quelque chose dont je ne suis pas sûr. Fondamentalement, j'essaye d'écrire une méthode qui prend un objet comme paramètre, et essaye alors de marshaler cet objet indépendamment de son type. Je ne peux pas comprendre comment obtenir le type à utiliser lors de l'instanciation de l'objet générique JAXBElement. Est-ce possible? Des idées? Ma tentative suit:Réflexion Java - Obtention d'un type à partir d'un objet pour instancier un générique

String marshalObject(Object obj) { 
    Class c = obj.getClass(); 
    Type t = (Type) c; 

    QName _QNAME = new QName("http://www.acme.com/ImportExport", c.getName()); 
    StringWriter sw = new StringWriter(); 
    try { 
     ObjectFactory of = new ObjectFactory(); 
     JAXBElement<?> jaxElement = new JAXBElement<t>(_QNAME, c, null, obj); 
     JAXBContext context = JAXBContext.newInstance(c); 
     Marshaller m = context.createMarshaller(); 
     m.marshal(jaxElement, sw); 
    } catch(JAXBException jbe){ 
     System.out.println("Error marshalling object: " + jbe.toString()); 
     return null; 
    } 

    return sw.toString(); 
} 

Répondre

0

Si vous ne vous souciez pas de quel type JAXBElement est de (vous ne se soucient pas si c'est un JAXBElement<String> ou JAXBElement<Foo>, vous pouvez simplement utiliser le type brut (JAXBElement) et s'arrêter ... le paramètre de type cela génère un avertissement que vous pouvez supprimer

+0

Wow, je ne peux pas croire que j'ai raté. Merci! –

2

le générique officiel moyen nerd de le faire est de coller un paramètre de type sur la méthode que vous déclariez:

<T> String marshalObject(T obj) { 

Ensuite, lorsque vous g et la classe:

Class<T> c = obj.getClass(); // something like that 

Puis enfin:

JAXBElement<T> jaxElement = new JAXBElement<T>(_QNAME, c, null, obj); 
+0

La première suggestion d'utiliser un type brut a fonctionné pour mes fins, mais je vais revenir en arrière et donner un coup de feu pour voir la «bonne» façon de le faire. Merci pour l'info! –

0

Si nécessaire, ajouter QName:

private static <T> JAXBElement<T> makeQName(Object obj) { 
    Class c = obj.getClass(); 
    QName qName = new QName("com.ukrcard.xmlMock", obj.getClass().getName()); 
    return new JAXBElement<T>(qName, c, (T) obj); 
} 
+1

Expliquez la réponse! – gsamaras

Questions connexes