Отражение Java - Получение Типа от объекта для создания универсального - PullRequest
0 голосов
/ 08 ноября 2010

Я никогда раньше не использовал отражения и пытаюсь сделать что-то, что, я не уверен, возможно.По сути, я пытаюсь написать метод, который принимает Object в качестве параметра, а затем пытается маршалировать этот объект независимо от его типа.Я не могу понять, как получить тип для использования при создании экземпляра универсального объекта JAXBElement.Это возможно?Есть идеи?Моя попытка следующая:

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();
}

Ответы [ 4 ]

2 голосов
/ 08 ноября 2010

Официальный общий способ сделать это - прикрепить параметр типа к методу. Вы заявляете это:

<T> String marshalObject(T obj) {

Тогда, когда вы получите класс:

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

Тогда наконец:

JAXBElement<T> jaxElement = new JAXBElement<T>(_QNAME, c, null, obj);
0 голосов
/ 21 марта 2019

Я сделал простой способ, как показано ниже, и это сработало:

public static <T> JAXBElement<T> createJaxbElement(T object, Class<T> clazz) {
    return new JAXBElement<>(new QName(clazz.getSimpleName()), clazz, object);
}
0 голосов
/ 26 мая 2015

При необходимости добавьте 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);
}
0 голосов
/ 08 ноября 2010

Если вам все равно, к какому типу относится JAXBElement (т.е. вас не волнует, является ли он JAXBElement<String> или JAXBElement<Foo>, то вы можете просто использовать необработанный тип (JAXBElement) и оставитьпараметр типа. Это создаст предупреждение, которое вы можете подавить.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...