[英]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.