Java 如何在共享特定代码的两个类包之间调用相同的方法

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

我有两个由第三方控制的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读取表单类型,然后在此基础上进行分支,这是最好的方法吗?

只要类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;
    }
}

看,堆栈溢出是一个比程序员更好的地方。两个答案几乎是立即的:)问题是模式不在我的控制之下,或者我可以用它解决很多问题:)我从来没有用这种方式思考过事情,我会在一分钟内给这样的东西一个旋转。