有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java创建扩展SAXParser默认处理程序的泛型类

我有几个表,我已经将它们转换成XML文件。让我们把它们称为表A、B和C,它们映射到java类A、B和C。我希望有一个泛型类,而不是单独的AXMLDao、BXMLDao和CXMLDao

A、B和C的成员变量映射到各自的A、B和C表。我在每个A、B、C类中都有public static Map<String, Method> getSetMethodMap(),它使用反射API返回数据库字段名到相应类中mutator方法的映射

我已经做了一个当前的实现,但在两个方面失败了:1)它充满了警告,因为我做得不正确;2)我不确定如何通过类型参数访问getSetMethodMap()

如果我使用public Map<String,Method> getMethodMap();的非静态方法创建了一个名为ReflectionType的接口,并将以下实现更改为<T extends ReflectionType>,那么我可以设置methodMap。。但这感觉不对

这是我当前的实现

public class GenericXMLDao<T> extends DefaultHandler {
    List<T> rows;
    String xmlFileName;
    Map<String, Method> methodMap; // This is for Reflection API
    T tempRow;

    String tempValue;

    public static Map<Class, String> getXMLFileMap() {
        Map<Class, String> map = new HashMap<Class, String>();
        map.put("A.class", "C:\\A.xml");
        ....
        return map;
    }

    public String fetchXMLFileName(Class c) {
        Map<Class,String> map = GenericXMLDao.getXMLFileMap();
        // Try Catch Throw exception if Class is not in map, but essentially:
        return map.get(c);
    }

    public List<T> getAllRows(Class c) {
        rows = new ArrayList<T>();
        xmlFileName = fetchXMLFileName(c);
        parseDocument();
        return rows;
    }

    private void parseDocument() {
        SAXParserFactory factory = SAXParserFactory.newInstance();
        try {
            SAXParser parser = factory.newSAXParser();
            parser.parse(xmlFileName, this);
        // catch ....
    }

    @Override
    public void startElement(String s, String s1, String elementName, Attributes attributes)
            throws SAXException {
        if (elementName.equalsIgnoreCase("DATA_RECORD")) {
            try {
                tempRow = (T) tempRow.getClass().newInstance();
            } catch (InstantiationException | IllegalAccessException e) {
                ...
            }
        }
    }
}

@Override
public void endElement(String s, String s1, String element) throws SAXException {
    if (element.equals("DATA_RECORD")) {
        rows.add(tempRow);
    }

    for (Entry<String,Method> entry : methodMap.entrySet()) {
        // Try ... catch reflection api
        if (element.equalsIgnoreCase(entry.getKey))) {
            entry.getValue().invoke(tempRow, tempValue);
        }
    }
}

@Override
public void characters(char[] ac, int i, int j) throws SAXException {
    tempValue = new String(ac, i, j);
}

我显然没有恰当地掌握泛型/类型参数化

这个怎么清理


共 (1) 个答案

  1. # 1 楼答案

    至于我

    <T extends ReflectionType>
    

    如果需要调用类T(在本例中为getSetMethodMap)的某些方法,则可以使用