Java反射 - 从对象获取类型以实例化泛型

时间:2010-11-08 15:27:36

标签: java generics reflection

我之前从未真正使用过反射,而且正在尝试一些我不确定是否可行的事情。基本上,我正在尝试编写一个将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 个答案:

答案 0 :(得分:2)

这样做的官方泛型书呆子方法是在方法上粘贴一个类型参数。你宣布它:

<T> String marshalObject(T obj) {

然后当你上课时:

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

最后:

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

答案 1 :(得分:0)

如果您不关心JAXBElement的类型(即您不关心它是JAXBElement<String>还是JAXBElement<Foo>,那么您只需使用原始类型({ {1}})并且不使用类型参数。这将生成一个可以抑制的警告。

答案 2 :(得分:0)

如果需要,请添加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);
}

答案 3 :(得分:0)

我做了如下简单的方法,它起作用了:

public static <T> JAXBElement<T> createJaxbElement(T object, Class<T> clazz) {
    return new JAXBElement<>(new QName(clazz.getSimpleName()), clazz, object);
}