在java中解析来自JAXB的静态类

在java中解析来自JAXB的静态类,java,static,jaxb,Java,Static,Jaxb,我有以下课程: @XmlRootElement public class MyClass{ public static MyClass myClass=new MyClass(); @XmlElement public static Object variable1=0; @XmlElement public static Object variable2=0; @XmlElement public static Object variable3=0;

我有以下课程:

@XmlRootElement 
public class MyClass{
public static MyClass myClass=new MyClass();
   @XmlElement
   public static Object variable1=0;
   @XmlElement
   public static Object variable2=0;
   @XmlElement
   public static Object variable3=0;
   public final Object constant1=5;
}
我正在通过JAXB从XML解析此类:

MyClass.myClass=(MyClass )  jaxbUnmarshaller.unmarshal(reader);
但是如果我打印出其中一个变量的值,它总是0。 我该怎么做? 问题在于静态访问。如果它是一个非静态类,它就会工作

我想分析一下:

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<MyClass>
<variable1>1</variable1>
<variable2>2</variable2>
<variable3>3</variable3>
 </MyClass>
现在我可以:

MyClass.variable1=helper.variable1;

但这只是一个解决办法

JAXB始终适用于使用类的实例。如果你看

(MyClass )  jaxbUnmarshaller.unmarshal(reader);
它返回类的一个实例。我不清楚,为什么需要以
静态方式使用变量。您正在将
MyClass
实例保存到一个静态变量
MyClass
。如果您以非静态方式使用MyClass,则至少该
MyClass.MyClass
应包含有效值。但您可以通过静态变量访问此实例:

 MyClass.myClass.variable1
但是如果您确实需要
variable1
成为一个静态的变量,那么您应该为您的类实现getter/setter来设置静态变量。JAXB将使用这些变量而不是您的变量。因此,您可以将值写入所需的任何目标/变量

编辑1:

下面是我的一段测试代码,它设置了静态变量。为什么要对variable1..3使用对象类型?JAXB为您的应用程序执行类型映射。我把它改成了
int

import java.io.StringReader;
import javax.xml.bind.JAXBContext;
import javax.xml.bind.JAXBException;
import javax.xml.bind.Unmarshaller;
import javax.xml.bind.annotation.XmlElement;
import javax.xml.bind.annotation.XmlRootElement;

@XmlRootElement(name = "MyClass")
public class MyClass {
    public static MyClass myClass = new MyClass();

    public static int variable1 = 0;
    public static int variable2 = 0;
    public static int variable3 = 0;

    public final Object constant1 = 5;

    @XmlElement
    public int getVariable1() {
        return variable1;
    }

    public void setVariable1(int variable1) {
        MyClass.variable1 = variable1;
    }

    @XmlElement
    public int getVariable2() {
        return variable2;
    }

    public void setVariable2(int variable2) {
        MyClass.variable2 = variable2;
    }

    @XmlElement
    public int getVariable3() {
        return variable3;
    }

    public void setVariable3(int variable3) {
        MyClass.variable3 = variable3;
    }

    public static void main(String[] args) throws JAXBException {
        String data = "<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"yes\"?>\n"
                + "<MyClass>\n"
                + "<variable1>1</variable1>\n"
                + "<variable2>2</variable2>\n"
                + "<variable3>3</variable3>\n"
                + "</MyClass>";

        JAXBContext context = JAXBContext.newInstance(MyClass.class);
        Unmarshaller jaxbUnmarshaller = context.createUnmarshaller();

        MyClass.myClass = (MyClass) jaxbUnmarshaller.unmarshal(new StringReader(data));

        System.out.println(MyClass.variable1);
        System.out.println(MyClass.variable2);
        System.out.println(MyClass.variable3);

        System.out.println(MyClass.myClass.variable1);
        System.out.println(MyClass.myClass.variable2);
        System.out.println(MyClass.myClass.variable3);
    }
}
导入java.io.StringReader;
导入javax.xml.bind.JAXBContext;
导入javax.xml.bind.JAXBException;
导入javax.xml.bind.Unmarshaller;
导入javax.xml.bind.annotation.xmlement;
导入javax.xml.bind.annotation.XmlRootElement;
@XmlRootElement(name=“MyClass”)
公共类MyClass{
公共静态MyClass MyClass=新MyClass();
公共静态int变量1=0;
公共静态int变量2=0;
公共静态int变量3=0;
公共最终目标常数1=5;
@XmlElement
public int getVariable1(){
返回变量1;
}
公共void setVariable1(int variable1){
MyClass.variable1=variable1;
}
@XmlElement
public int getVariable2(){
返回变量2;
}
公共void setVariable2(int variable2){
MyClass.variable2=variable2;
}
@XmlElement
public int getVariable3(){
返回变量3;
}
public void setVariable3(int variable3){
MyClass.variable3=variable3;
}
公共静态void main(字符串[]args)抛出JAXBEException{
字符串数据=“\n”
+“\n”
+“1\n”
+“2\n”
+“3\n”
+ "";
JAXBContext context=JAXBContext.newInstance(MyClass.class);
Unmarshaller=context.createUnmarshaller();
MyClass.MyClass=(MyClass)jaxbUnmarshaller.unmarshal(新StringReader(数据));
System.out.println(MyClass.variable1);
System.out.println(MyClass.variable2);
System.out.println(MyClass.variable3);
System.out.println(MyClass.MyClass.variable1);
System.out.println(MyClass.MyClass.variable2);
System.out.println(MyClass.MyClass.variable3);
}
}

引发了什么异常?显示一段可编译的代码。发布一些测试数据。没有例外,没有测试数据,jaxbUnmarshaller可以工作,如果不是静态的,它就可以工作。至少应该有一个简单的XML可用。您试图解析什么XML?好的,我编辑了它。我尝试了一种非静态的方式,它工作得很好,但我需要它以静态的方式工作看看我更新的答案。我已经包含了一个使用getter和setter实现静态方式的示例,而无需使用Helper类。
import java.io.StringReader;
import javax.xml.bind.JAXBContext;
import javax.xml.bind.JAXBException;
import javax.xml.bind.Unmarshaller;
import javax.xml.bind.annotation.XmlElement;
import javax.xml.bind.annotation.XmlRootElement;

@XmlRootElement(name = "MyClass")
public class MyClass {
    public static MyClass myClass = new MyClass();

    public static int variable1 = 0;
    public static int variable2 = 0;
    public static int variable3 = 0;

    public final Object constant1 = 5;

    @XmlElement
    public int getVariable1() {
        return variable1;
    }

    public void setVariable1(int variable1) {
        MyClass.variable1 = variable1;
    }

    @XmlElement
    public int getVariable2() {
        return variable2;
    }

    public void setVariable2(int variable2) {
        MyClass.variable2 = variable2;
    }

    @XmlElement
    public int getVariable3() {
        return variable3;
    }

    public void setVariable3(int variable3) {
        MyClass.variable3 = variable3;
    }

    public static void main(String[] args) throws JAXBException {
        String data = "<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"yes\"?>\n"
                + "<MyClass>\n"
                + "<variable1>1</variable1>\n"
                + "<variable2>2</variable2>\n"
                + "<variable3>3</variable3>\n"
                + "</MyClass>";

        JAXBContext context = JAXBContext.newInstance(MyClass.class);
        Unmarshaller jaxbUnmarshaller = context.createUnmarshaller();

        MyClass.myClass = (MyClass) jaxbUnmarshaller.unmarshal(new StringReader(data));

        System.out.println(MyClass.variable1);
        System.out.println(MyClass.variable2);
        System.out.println(MyClass.variable3);

        System.out.println(MyClass.myClass.variable1);
        System.out.println(MyClass.myClass.variable2);
        System.out.println(MyClass.myClass.variable3);
    }
}