我有以下几点:

class A{
    @XmlElement
    String name;

    //getters and setters
}


class B extends A{
    @XmlElement
    String height;

    //getters and setters
}

终于我有了
@XmlRootElement
class P{
    @XmlElement
    List<A> things;

    //getters and setters
}

如果我做
List<A> l = new ArrayList<A>();
l.add(new B('hello', 20)) //Add new B with height of 20 and name hello

P p = new P();
p.setThings(l); //Set things to list of B's.

和P编码(marshal),我只是把田野作为事物的一部分,而不是高度。

我知道我可以在A中添加@XmlSeeAlso(B.class),这一切都可以。

但是问题是我不知道B以外的所有扩展类,因为A可能在运行时扩展。

如何在运行时动态定义@XmlSeeAlso?

最佳答案

这取决于您如何创建JAXBContext。可以使用所有类的显式列表来调用newInstance method,该方法的文档也提供了类似的示例。


class Foo {
    @XmlTransient FooBar c;
    Bar b;
}
class Bar { int x; }
class Zot extends Bar { int y; }
class FooBar { }

编辑:如果您至少知道潜在的jaxb类的软件包名称,则也可以create a context given a context path

如果上述方法不可行,您还可以在运行时根据要序列化的对象创建类列表。我认为最好尝试重构您的代码以使其不必要。以下代码未经测试:
Set<Class> classes = new HashSet<Class>();
classes.add(p.getClass());
for (A a : p.getThings()) {
    classes.add(a.getClass());
}
JAXBContext context = JAXBContext.newInstance(classes.toArray(new Class[classes.size()]));

10-07 18:23