2011-11-27 149 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