public class XmlConvert2Bean{
public T convert2Bean(T t, String xml) throws JAXBException {
StringReader reader = new StringReader(xml);
JAXBContext jaxbContext = JAXBContext.newInstance(t.getClass());
Unmarshaller jaxbUnmarshaller = jaxbContext.createUnmarshaller();
T result = (T) jaxbUnmarshaller.unmarshal(reader);
return result;
}
}
在t.getClass()那里想要通过T.class获得class,然而T是变量,所以不可以使用T.class。我搜索T.class,有好多这样的解决办法:
public ClassgetTClass() {
return (Class) ((ParameterizedType) getClass().getGenericSuperclass()).getActualTypeArguments()[0];
}
而我却报castClassException异常,原因是我这个类并没有带有泛型的父类。
//getGenericSuperclass()获得带有泛型的父类
//Type是 Java 编程语言中所有类型的公共高级接口。它们包括原始类型、参数化类型、数组类型、类型变量和基本类型。
Type type=clazz.getGenericSuperclass();
//ParameterizedType参数化类型,即泛型
ParameterizedType p=(ParameterizedType)type;
//getActualTypeArguments获取参数化类型的数组,泛型可能有多个
Class c=(Class) p.getActualTypeArguments()[0];
我上面的方法还需要实例化一个对象传给方法,而我想要的只是传class过来。其实可以实例化Xml2JavaUtil时传要转化成的class进来。
public XmlConvert2Bean(Class clazz) {
try {
jaxbContext = JAXBContext.newInstance(clazz);
} catch (JAXBException e) {
e.printStackTrace();
}
}
设置xml节点属性值
使用@XmlAttribute标签即可,
参考:https://blog.csdn.net/Dawn_Bells/article/details/81908275
@XmlRootElement(name = "Xml")
@XmlAccessorType(XmlAccessType.FIELD)
public class RequestBean{
@XmlAttribute(name = "version") //设置节点属性
private String version;
private Body body;
@XmlElement(name = "sign") //设置子节点
private String sign;
//省略封装
}
@XmlRootElement(name = "Body")
@XmlAccessorType(XmlAccessType.FIELD)
public class Body{
...
}
最终得到的xml文件大致为:
111111
111
fee
payname
accountType