JAXB如何猜测列表的模式类型?

时间:2013-02-09 01:02:39

标签: java generics jaxb

这是我从头开始定义的示例jaxb类。当我尝试使用JAXB为此类生成模式时,它正确地猜测列表的itemType为“int”

JVM不会在运行时丢弃泛型吗?通过这样做,容器类型的List在运行时丢失,但仍然,jaxb知道itemType是Integer。我很好奇jaxb框架是如何实现的。有什么想法吗?

@XmlAccessorType(XmlAccessType.FIELD)
@XmlType(name = "int-list")
public class IntegerList{
    @XmlValue
    private List<Integer> values;

    public List<Integer> getValues() {
        return values;
    }

    public void setValues(List<Integer> values) {
        this.values = values;
    }
}

使用JAXBContext.generateSchema生成的对应模式:

  <xs:simpleType name="int-list">
    <xs:list itemType="xs:int"/>
  </xs:simpleType>

1 个答案:

答案 0 :(得分:2)

  

JVM不会在运行时丢弃泛型吗?

是的,关于实际的字节码(好吧,它是抛弃它们的编译器)。但是仍然可以通过使用反射在运行时收集类和某些变量的泛型类型信息。例如:

Field field = IntegerList.class.getDeclaredField("values");
Type fieldType = field.getGenericType();
Type typeArg = ((ParameterizedType)fieldType).getActualTypeArguments()[0];
System.out.println(typeArg); //class java.lang.Integer

只是一个猜测,但是JAXB可能会做类似的事情,然后将Integer.class映射到int.class