@Retention(value=RUNTIME) @Target(value={字段,METHOD}) public @interface XmlElementRef
将JavaBean属性映射到从属性类型派生的XML元素。
用法
 @XmlElementRef注释可以使用JavaBean属性或从XmlElementRefs 
 此注释将XML元素名称与JavaBean属性动态关联。 当JavaBean属性用XmlElement注释时,XML元素名称是从JavaBean属性名称静态派生的。 但是,当使用此注释时,XML元素名称将在运行时从JavaBean属性类型的实例派生。 
  public void setTerm(JAXBElement
         );
     public JAXBElement
          getTerm();  
        用XmlElementDecl注释的元素工厂方法用于创建一个包含XML元素名称的JAXBElement实例。 元素属性上存在@XmlElementRef注释,表示使用JAXBElement实例的元素名称,而不是从JavaBean属性名称派生XML元素名称。 
用法受以下限制:
JAXBElement ,则@XmlElementRef}.name()和@XmlElementRef.namespace()必须使用@XmlRegistry(通常由ObjectFactory类生成的类)指向带有@XmlElementDecl注释的元素工厂方法模式编译器): 
         JAXBElement ,则属性或字段引用的类型必须使用XmlRootElement 注释 。 XmlElementWrapper , XmlJavaTypeAdapter 。 有关其他常见信息,请参阅javax.xml.bind.package javadoc中的“Package Specification”。
示例1:Ant任务示例
以下Java类层次结构模拟Ant构建脚本。 Ant任务对应于类层次结构中的类。 Ant任务的XML元素名称由其相应类上的@XmlRootElement注释指示。  @XmlRootElement(name="target")
     class Target {
         // The presence of @XmlElementRef indicates that the XML
         // element name will be derived from the @XmlRootElement
         // annotation on the type (for e.g. "jar" for JarTask).
         @XmlElementRef
         List<Task> tasks;
     }
     abstract class Task {
     }
     @XmlRootElement(name="jar")
     class JarTask extends Task {
         ...
     }
     @XmlRootElement(name="javac")
     class JavacTask extends Task {
         ...
     }
     <!-- XML Schema fragment -->
     <xs:element name="target" type="Target">
     <xs:complexType name="Target">
       <xs:sequence>
         <xs:choice maxOccurs="unbounded">
           <xs:element ref="jar">
           <xs:element ref="javac">
         </xs:choice>
       </xs:sequence>
     </xs:complexType>  
       因此下面的代码片段:
  Target target = new Target();
     target.tasks.add(new JarTask());
     target.tasks.add(new JavacTask());
     marshal(target);  
       将产生以下XML输出: 
         <target>
       <jar>
         ....
       </jar>
       <javac>
         ....
       </javac>
     </target>  
        有一个类扩展Task没有XmlRootElement是不是一个错误。 但是,它们不能显示在XML实例中(因为它们没有XML元素名称)。 
示例2:XML模式支持组支持
以下示例显示了XML模式替换组的注释。 注释和ObjectFactory是从模式派生的。
  @XmlElement
     class Math {
         //  The value of type()is
         //  JAXBElement.class , which indicates the XML
         //  element name ObjectFactory - in general a class marked
         //  with @XmlRegistry. (See ObjectFactory below)
         //
         //  The name() is "operator", a pointer to a
         // factory method annotated with a
         //  XmlElementDecl with the name "operator". Since
         //  "operator" is the head of a substitution group that
         //  contains elements "add" and "sub" elements, "operator"
         //  element can be substituted in an instance document by
         //  elements "add" or "sub". At runtime, JAXBElement
         //  instance contains the element name that has been
         //  substituted in the XML document.
         //
         @XmlElementRef(type=JAXBElement.class,name="operator")
         JAXBElement<? extends Operator> term;
     }
     @XmlRegistry
     class ObjectFactory {
         @XmlElementDecl(name="operator")
         JAXBElement<Operator> createOperator(Operator o) {...}
         @XmlElementDecl(name="add",substitutionHeadName="operator")
         JAXBElement<Operator> createAdd(Operator o) {...}
         @XmlElementDecl(name="sub",substitutionHeadName="operator")
         JAXBElement<Operator> createSub(Operator o) {...}
     }
     class Operator {
         ...
     }  
       因此,以下代码片段
  Math m = new Math();
     m.term = new ObjectFactory().createAdd(new Operator());
     marshal(m);  
       将产生以下XML输出: 
         <math>
       <add>...</add>
     </math>  
      XmlElementRefs 
       public abstract 类 type
如果该值为DEFAULT.class,则从JavaBean属性的类型推断该类型。
public abstract String namespace
name()用于确定JavaBean属性的XML元素。 
            如果type()是JAXBElement.class ,那么namespace()和name()指向一个工厂方法与XmlElementDecl 。 XML元素名称是从工厂方法的XmlElementDecl注释中的元素名称,或者如果在XML文档中替换了来自其替换组(其中是头元素)的元素,则元素名称来自取代的XmlElementDecl元件。 
 如果type()不是JAXBElement.class ,则XML元素名称是与类型静态关联的XML元素名称,使用类型上的注释XmlRootElement 。 如果类型没有注释与XmlElementDecl ,那么这是一个错误。 
如果type()不是JAXBElement.class ,则该值必须为“”。
public abstract String name
namespace() 
           public abstract boolean required
如果required()为true,则Javabean属性将映射到具有minOccurs =“1”的XML模式元素声明。 maxOccurs对于单值属性为“1”,对于多值属性为“无界”。
如果required()为false,则Javabean属性将映射到具有minOccurs =“0”的XML Schema元素声明。 maxOccurs对于单值属性为“1”,对于多值属性为“无界”。
 为了兼容JAXB 2.1,此属性默认为true ,尽管XmlElement.required()默认为false。 
 Submit a bug or feature 
For further API reference and developer documentation, see Java SE Documentation. That documentation contains more detailed, developer-targeted descriptions, with conceptual overviews, definitions of terms, workarounds, and working code examples.
 Copyright © 1993, 2014, Oracle and/or its affiliates. All rights reserved.