简体   繁体   English

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

[英]Java Reflection - Getting a Type from an object to instantiate a generic

I've never really used reflection before and am attempting something I'm not sure is possible.我以前从未真正使用过反射,并且正在尝试一些我不确定是否可行的方法。 Basically, I'm trying to write a method that takes an Object as a parameter, and then attempts to marshal that object regardless of its type.基本上,我正在尝试编写一个将Object作为参数的方法,然后尝试编组该对象,而不管其类型如何。 I can't figure out how to get the type to use when instantiating the generic JAXBElement<T> object.我无法弄清楚在实例化通用JAXBElement<T>对象时如何获取要使用的类型。 Is this possible?这可能吗? My attempt:我的尝试:

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

The official generics nerd way to do this is to stick a type parameter on the method.官方泛型书呆子的方法是在方法上粘贴一个类型参数。 You declare it:你声明它:

<T> String marshalObject(T obj) {

Then when you get the class:然后当你得到课程时:

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

Then finally:然后最后:

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

I did simple way as below and it worked:我做了如下简单的方法,它奏效了:

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

If needed, add QName:如果需要,添加 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);
}

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

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM