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