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

时间:2012-02-08 18:19:44

标签: 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.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读取表单类型,然后基于这是最佳方式进行分支?

3 个答案:

答案 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元素创建一个公共类型来实现这一点。