3

这是我从头开始定义的示例 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>
4

1 回答 1

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.classint.class.

于 2013-02-09T01:49:28.783 回答