我有以下课程:
@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;
但这只是一种解决方法。
答案 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);
}
}