我有两个由第三方控制的XML模式自动生成的包(由JAXB生成)。它们的XML定义部分是相同的。我将使用其中一些部分来收集处理XML的信息。我怎样才能减少代码重复量呢?
我希望能够创建我可以更通用地调用的方法。以下是已生成的两种方法的示例:
com.example.xml1 o = (com.example.xml1) u.unmarshal(document);
String type1 = o.getRoot().getType();
com.example.xml2 o = (com.example.xml2) u.unmarshal(document);
String type2 = o.getRoot().getType();
我可以使用哪种方法来获取对象并调用:
// magic somewhere in here
//Object o = u.unmarshal(document);
String type = o.getRoot().getType();
在我能够阅读该部分之前,我不会知道XML类型。是否会使用xPath读取表单类型,然后基于这是最佳方式进行分支?
答案 0 :(得分:1)
如果你不能修改生成的代码,那么你可以使用反射或子类这两个类,让它们实现相同的接口,这样就可以对它们进行类似的处理。
答案 1 :(得分:1)
正如加勒特霍尔回答的那样,你可以用反射来实现这一目标。这是一个使用反射从两种不同类型的对象调用getType()方法的工作示例:
package com.example;
public class MainProgram {
public static void main(String[] args) throws Exception {
XML1 x1 = new XML1("Foo");
XML2 x2 = new XML2("Bar");
String type1 = (String) x1.getClass().getMethod("getType").invoke(x1);
String type2 = (String) x2.getClass().getMethod("getType").invoke(x2);
System.out.println("type1 = " + type1);
System.out.println("type2 = " + type2);
}
}
class XML1 {
private String type;
public XML1(String type) {
this.type = type;
}
public String getType() {
return type;
}
public void setType(String type) {
this.type = type;
}
}
class XML2 {
private String type;
public XML2(String type) {
this.type = type;
}
public String getType() {
return type;
}
public void setType(String type) {
this.type = type;
}
}
答案 2 :(得分:0)
只要类xml1和xml2有一个具有getRoot()方法的公共超类(或接口),您就可以在它们上面调用它而无需额外的转换。您应该可以通过在xml架构中为xml1和xml2元素创建一个公共类型来实现这一点。