Java 具有多种类型的Hook方法

Java 具有多种类型的Hook方法,java,xml,Java,Xml,我想做什么 我想将几个不同的Java对象导出为XML。为了尽量减少代码重复,我采用了以下方法: 我创建了一个抽象类,实现了标准空DOM文档和transformer factory部分的创建 然后,我添加了一个抽象方法,用特定的对象数据填充DOM文档。 然后,我创建了一个CustomerExporter类,该类扩展了抽象类并实现了该特定对象的抽象方法 我要去工作 我的问题 如何编写抽象方法,使其能够处理不同的Java对象 问题 对象的类型不同,因此属性并不总是相同的。所以一个接口就不起作用了(或者

我想做什么

我想将几个不同的Java对象导出为XML。为了尽量减少代码重复,我采用了以下方法:

我创建了一个抽象类,实现了标准空DOM文档和transformer factory部分的创建

然后,我添加了一个抽象方法,用特定的对象数据填充DOM文档。 然后,我创建了一个CustomerExporter类,该类扩展了抽象类并实现了该特定对象的抽象方法

我要去工作

我的问题

如何编写抽象方法,使其能够处理不同的Java对象

问题

对象的类型不同,因此属性并不总是相同的。所以一个接口就不起作用了(或者会吗?)

代码

客户类别

package org.flexdataexoporter.dao;

public class Customer{

    private int customerID;
    private String firstname;
    private String lastname;
    private int telnumber;

    public Customer(int customerID, String firstname, String lastname, int telnumber){

        this.customerID = customerID;
        this.firstname = firstname;
        this.lastname = lastname;
        this.telnumber = telnumber;
    }

    public int getCustomerID(){
        return customerID;
    }

    public String getFirstName(){
        return firstname;
    }

    public String getLastName(){
        return lastname;
    }

    public int getTelNumber(){
        return telnumber;
    }

    public void setCustomerID(int customerID) {
        this.customerID = customerID;
    }

    public void setFirstname(String firstname) {
        this.firstname = firstname;
    }

    public void setLastname(String lastname) {
        this.lastname = lastname;
    }

    public void setTelnumber(int telnumber) {
        this.telnumber = telnumber;
    }
}
顾客阶级

package org.flexdataexoporter.dao;

import java.util.ArrayList;

public class Customers extends ArrayList<Customer>  {

    private static final long serialVersionUID = 1L;

    public Customers(){ };

}
特定出口类别

package org.flexdataexporter.export;

import javax.xml.transform.TransformerException;

import org.flexdataexoporter.dao.Customer;
import org.flexdataexoporter.dao.Customers;
import org.w3c.dom.Document;
import org.w3c.dom.Element;

public class CustomerExporter extends XMLExporter {

    public CustomerExporter(){ }

    @Override
    public void fillXML(Document doc, Customers customers) throws TransformerException {
        Element rootElement = doc.createElement("customers");
        doc.appendChild(rootElement);

        for(Customer c  : customers){
            Element customer = doc.createElement("customer");
            rootElement.appendChild(customer);
            customer.setAttribute("id", Integer.toString(c.getCustomerID()));

            Element name = doc.createElement("firstname");
            name.appendChild(doc.createTextNode(c.getFirstName()));
            customer.appendChild(name);

            Element lastname = doc.createElement("lastname");
            lastname.appendChild(doc.createTextNode(c.getLastName()));
            customer.appendChild(lastname);

            Element phone = doc.createElement("phone");
            phone.appendChild(doc.createTextNode(Integer.toString(c.getTelNumber())));
            customer.appendChild(phone);
            super.writeDoc(doc);
        }
    }
}

我希望有人能帮我解决问题。

我建议采用不同的方法:

  • 指定XSD
  • 使用xjc(例如通过Maven插件或Ant任务)生成JAXB类
  • 使用JAXB封送XML文档

  • 我建议找一家图书馆为你做这件事。但是假设你需要自己写,我想你想要的是泛型

    public abstract class XMLExporter<T> {
        public void generateXML(T object) throws ParserConfigurationException, TransformerException{
            Document doc = createDomDoc();
            fillXML(doc, object);
        }
    
        public abstract void fillXML(Document doc, T object) throws TransformerException;
    }
    
    公共抽象类XMLExporter{
    public void generateXML(T对象)抛出ParserConfiguration异常、TransformerException{
    Document doc=createDomDoc();
    fillXML(doc,object);
    }
    公共抽象void fillXML(文档文档,T对象)抛出TransformerException;
    }
    
    然后是你的实现类

    public class CustomerExporter extends XMLExporter<Customers> {
    
    }
    
    公共类CustomerExporter扩展了XMLExporter{
    }
    

    我已经有一段时间没有使用Java了,所以我的语法可能是错误的或不完整的,但希望这能达到您想要的效果。

    非常感谢,我一直在关注这一点。当你盯着它看了那么久,你就再也看不到它了。真的,谢谢。
    public class CustomerExporter extends XMLExporter<Customers> {
    
    }