我在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类设置为静态时,我只能编译它。 有人可以帮我理解什么是错的。
谢谢。
答案 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);
}