gpt4 book ai didi

java - 将 JAXB、泛型和反射结合到 XML 序列化我所有的 Java 类

转载 作者:行者123 更新时间:2023-11-30 11:35:24 24 4
gpt4 key购买 nike

我的代码如下:

    System.out.println("This will save a table to XML data sheet.");
System.out.println("Please pick a table to save: " + listOfTables.toString());
command = scan.nextLine();
if(listOfTables.contains(command))
{
System.out.println("successfuly found table to save: " + command);
try //Java reflection
{
Class<?> myClass = Class.forName(command); // get the class named after their input
Method listMethod = myClass.getDeclaredMethod("list"); // get the list method from the class
Object returnType = listMethod.invoke(myClass, new Object[]{}); // run the list method
ArrayList<Object> objectList = (ArrayList)returnType; // get the arraylist of objects to send to XML
try
{
JAXBContext jaxbContext = JAXBContext.newInstance(myClass);
Marshaller marshaller = jaxbContext.createMarshaller();
marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true);
JAXBElement<?> jaxbElement = new JAXBElement<?>(new QName("jaxbdemo", "generated"), myClass, objectList.get(0));
marshaller.marshal(jaxbElement, System.out);

} catch (JAXBException e) {}
}
catch (ClassNotFoundException | SecurityException | NoSuchMethodException | IllegalAccessException | IllegalArgumentException | InvocationTargetException e) { }

我的问题是:

JAXBElement<?> jaxbElement = new JAXBElement<?>(new QName("jaxbdemo", "generated"), myClass, objectList.get(0));

也不是:

JAXBElement<myClass> jaxbElement = new JAXBElement<myClass>(new QName("jaxbdemo", "generated"), myClass, objectList.get(0));

将编译。那么我需要在我的 JAXBElement 类型的 <> 之间放置什么?顺便说一句,我得到:

The constructor JAXBElement<myClass>(QName, Class<myClass>, myClass) refers to the missing type myClass

和:

Cannot instantiate the type JAXBElement<?>

最佳答案

您需要使用辅助方法来执行此操作。这是一个粗略的例子:

static <T> void helper(Class<T> myClass) {

Method listMethod = myClass.getDeclaredMethod("list");
Object returnType = listMethod.invoke(myClass, new Object[]{});
@SuppressWarnings("unchecked") // [carefully document why this is okay here]
ArrayList<T> objectList = (ArrayList<T>)returnType;

...

JAXBElement<T> jaxbElement = new JAXBElement<T>(
new QName("jaxbdemo", "generated"),
myClass,
objectList.get(0)
);

...
}

从那时起,您可以自由返回 JAXBElement<?>或者在助手中完成剩余的工作。

如前所述,您应该记录未经检查的转换,解释为什么调用 list对于由 Class<T> 表示的给定类保证返回 ArrayList<T> ,正如您的代码所假设的那样。这种方法充其量对我来说似乎很脆弱,当你调用我时我已经发现了一个错误 invoke :

listMethod.invoke(myClass, new Object[]{});

该方法将调用该方法的实例作为其第一个参数(如果它是静态方法,则为 null),但您传入的是 myClass - 这不可能是对的。

关于java - 将 JAXB、泛型和反射结合到 XML 序列化我所有的 Java 类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15150788/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com