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

时间:2014-04-11 07:38:25

标签: 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;
   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>

没有例外或事情。 如果我使用与非静态相同的变量创建一个新类并将xml解析为这个新类,我可以访问所有已解析的变量。

public class Helper{ public int variable1=0; ..... }

Helper helper=(Helper) jaxbUnmarshaller.unmarshal(reader);

现在我可以做:

MyClass.variable1=helper.variable1;

但这只是一种解决方法。

1 个答案:

答案 0 :(得分:1)

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

(MyClass )  jaxbUnmarshaller.unmarshal(reader);

它返回你班级的一个实例。我不清楚为什么你需要static方式的变量。您将MyClass实例保存为静态变量myClass。如果您以非静态方式使用它,则至少此MyClass.myClass应保留有效值。但是您可以通过静态变量访问此实例:

 MyClass.myClass.variable1

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

修改1:

所以这是我的测试代码,它确实设置了你的静态变量。为什么要为variable1..3使用Object类型? 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);
    }
}