使用JAXB的Marshal内部类 - Java

时间:2011-11-27 08:03:09

标签: java jaxb inner-classes

我在JAXB http://blog.adamsbros.org/2010/02/07/jaxb-example-code/上遵循了以下教程,并希望修改它以包含我想要作为嵌套(内部)类的类,如下所示:

import javax.xml.bind.JAXBContext; 
import javax.xml.bind.JAXBException; 
import javax.xml.bind.annotation.*; 
import java.io.StringReader; 
import java.io.StringWriter; 

public class HighlevelClass
{


@XmlRootElement(name = "employee")
@XmlAccessorType(XmlAccessType.FIELD)
public class Employee
{

    @XmlAttribute
    public int id;

    @XmlElement
    public
    String firstName;

    @XmlElement
    public
    String middleName;

    @XmlElement
    public
    String lastName;

    public Employee()
    {
    }

}

public static void main(String args[]) throws JAXBException
{

    HighlevelClass HClass = new HighlevelClass();
    Employee john = HClass.new Employee();
    john.firstName = "John";
    john.middleName = "Robert";
    john.lastName = "Doe";
    john.id = 1;

    // write it out as XML
    final JAXBContext jaxbContext = JAXBContext.newInstance(HighlevelClass.Employee.class);
}

但是当我尝试创建JAXB上下文时,它在最后一行给出了一个错误。我尝试了多种组合,但是当我将Employee类设置为静态时,我只能编译它。 有人可以帮我理解什么是错的。

谢谢。

1 个答案:

答案 0 :(得分:5)

main()方法是静态的,因此它只能访问类的静态成员。这不是JAXB问题。这就是语言的运作方式。

内部类是一种成员。非静态内部类可以调用外部类的非静态方法,即可以访问外部类实例(直接使用“HighlevelClass.this”或通过调用方法或访问字段来直接访问)。

这就是您必须将内部类定义为静态的原因。如果您不想这样做,您可以将您的类设置为常规顶级类,或者将您的jaxb代码移动到实例方法并在使用之前创建类的实例:

public static void main(String args[]) throws JAXBException {
    new HighlevelClass().jaxbTest();
}


private void jaxbTest() throws JAXBException {

    HighlevelClass HClass = new HighlevelClass();
    Employee john = HClass.new Employee();
    john.firstName = "John";
    john.middleName = "Robert";
    john.lastName = "Doe";
    john.id = 1;

    // write it out as XML
    final JAXBContext jaxbContext = JAXBContext.newInstance(HighlevelClass.Employee.class);
}