簡體   English   中英

Java 反射 - 從對象獲取類型以實例化泛型

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

我以前從未真正使用過反射,並且正在嘗試一些我不確定是否可行的方法。 基本上,我正在嘗試編寫一個將Object作為參數的方法,然后嘗試編組該對象,而不管其類型如何。 我無法弄清楚在實例化通用JAXBElement<T>對象時如何獲取要使用的類型。 這可能嗎? 我的嘗試:

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

官方泛型書呆子的方法是在方法上粘貼一個類型參數。 你聲明它:

<T> String marshalObject(T obj) {

然后當你得到課程時:

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

然后最后:

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

我做了如下簡單的方法,它奏效了:

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

如果需要,添加 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