Java 如何在共享特定代码的两个类包之间调用相同的方法
我有两个由第三方控制的XML模式自动生成的包(由JAXB生成)。它们的XML定义中有相同的部分。我将使用其中的一些部分来收集处理XML所需的信息。我如何才能做到这一点,以减少代码重复的数量 我希望能够创建可以更一般地调用的方法。以下是已生成的两种方法的示例:Java 如何在共享特定代码的两个类包之间调用相同的方法,java,Java,我有两个由第三方控制的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.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读取表单类型,然后在此基础上进行分支,这是最好的方法吗?只要类xml1和xml2有一个具有getRoot()方法的公共超类(或接口),您就可以在这两个类上调用它,而无需额外强制转换。通过在xml模式中为xml1和xml2元素创建一个公共类型,您应该能够做到这一点。如果您无法修改生成的代码,那么您可以使用反射或对这两个类进行子类化,并让它们实现相同的接口,以便对它们进行类似的处理。正如Garrett Hall回答的那样,您可以使用反射来实现这一点。下面是一个工作示例,它使用反射从两种不同类型的对象调用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;
}
}
看,堆栈溢出是一个比程序员更好的地方。两个答案几乎是立即的:)问题是模式不在我的控制之下,或者我可以用它解决很多问题:)我从来没有用这种方式思考过事情,我会在一分钟内给这样的东西一个旋转。