2011-11-27 140 views
1

我也跟着上JAXB http://blog.adamsbros.org/2010/02/07/jaxb-example-code/下面的教程,并希望修改它,包括我想作为嵌套(内部)类的类如下:元帅内部类 - Java的

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类时才编译它。 有人可以帮我理解最新的错误。

谢谢。

回答

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); 
} 
+1

谢谢AlexR。我几乎明白了原因。我现在的困惑是,如果我让Employee成为常规顶级类并从main()方法调用JAXBContext.newInstance(Employee.class),那么为什么它会工作?因为main()是静态的,所以它如何访问非静态成员?它为什么会在这种情况下工作,而不是在这种情况下?感谢您的帮助。 – madu