在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);
}
}