2013-02-09 29 views
3

以下是我從頭開始定義的示例jaxb類。當我嘗試使用JAXB爲這個類生成模式時,它正確猜測列表的itemType爲「int」JAXB如何猜測列表的模式類型?

不是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> 
+0

我認爲這是通過註釋,類型被帶入運行時。 – 2013-02-09 01:51:04

回答

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