且构网

分享程序员开发的那些事...
且构网 - 分享程序员编程开发的那些事

在javax.xml.bind中创建一个通用集合

更新时间:2023-02-14 19:27:25

反思问题

以下是需要进行的反射测试。我相信类型擦除是阻止这种情况发生的原因:

The following is the reflection test that needs to be made work. I believe type erasure is what is preventing this from happening:

import java.lang.reflect.Method;
import java.util.ArrayList;
import java.util.List;

public class TestReflection extends AbstractCollection<String> {

    private List<Integer> childCollection = new ArrayList<Integer>();


    public List<Integer> getChildCollection() {
        return childCollection;
    }

    public static void main(final String[] args) throws Exception {
        final TestReflection testReflection = new TestReflection();

        final Class<?> cls = testReflection.getClass();
        Method method1 = cls.getMethod("getChildCollection", new Class[] {});
        System.out.println(method1.getGenericReturnType());

        Method method2 = cls.getMethod("getCollection", new Class[] {});
        System.out.println(method2.getGenericReturnType());
   }

}

以上代码将输出什么是如下所示。这是因为getCollection方法位于AbstractCollection的上下文中,而不是TestReflection。这是为了确保Java二进制文件的向后兼容性:

The above code will output what is shown below. This is because the "getCollection" method is in the context of AbstractCollection and not TestReflection. This is to ensure backwards compatibility of the Java binaries:

java.util.List<java.lang.Integer>
java.util.List<T>






替代方法

如果集合中的项目将使用@XmlRootElement注释,那么您可以通过以下方式实现您想要的操作:

If the items in the collection will be annotated with @XmlRootElement, then you could achieve what you want to do with the following:

import java.util.ArrayList;
import java.util.List;
import javax.xml.bind.annotation.XmlAnyElement;

public abstract class AbstractCollection<T> {

    protected List<T> collection = new ArrayList<T>();

    @XmlAnyElement(lax=true)
    public List<T> getCollection() {
        return collection;
    }

}

假设Person看起来如下:

And assuming Person looks like the following:

import javax.xml.bind.annotation.XmlRootElement;

@XmlRootElement
public class Person {

}

然后是以下演示代码:

import javax.xml.bind.JAXBContext;
import javax.xml.bind.Marshaller;

public class Demo {

    public static void main(String[] args) throws Exception {
        JAXBContext jc = JAXBContext.newInstance(PersonCollection.class, Person.class);

        PersonCollection pc = new PersonCollection();
        pc.getCollection().add(new Person());
        pc.getCollection().add(new Person());

        Marshaller marshaller = jc.createMarshaller();
        marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true);
        marshaller.marshal(pc, System.out);
    }

}

将产生:

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<person_collection>
    <person/>
    <person/>
</person_collection>

有关详细信息,请参阅:

For more information see:

  • http://bdoughan.blogspot.com/2010/08/using-xmlanyelement-to-build-generic.html