3

これは、私が最初から定義したサンプルのjaxbクラスです。JAXBを使用してこのクラスのスキーマを生成しようとすると、リストのitemTypeが「int」であると正しく推測されます。

JVMは実行時にジェネリックを破棄しませんか?そうすることで、リストのコンテナタイプは実行時に失われますが、それでもjaxbはitemTypeが整数であることを認識します。これが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.classしていint.classます。

于 2013-02-09T01:49:28.783 に答える