2013-10-02 2 views
0

У меня есть несколько таблиц, которые у меня есть SELECT * 'd в XML-файлы. Позволяет называть их таблицы A, B и C, которые сопоставляются с java-классами A, B и C. Вместо того, чтобы создавать отдельные AXMLDao, BXMLDao и CXMLDao, я хочу иметь один общий класс.Создание универсального класса, который расширяет обработчик по умолчанию SAXParser

A, B и C имеют переменную-член, которая сопоставляется с соответствующими таблицами A, B и C. У меня есть public static Map<String, Method> getSetMethodMap() в каждом классе A, B, C, который возвращает сопоставление имени поля базы данных методу мутатора в соответствующем классе с использованием API отражения.

Я выполнил текущую реализацию, но он не работает по двум пунктам: 1) его полные предупреждения, потому что я не делаю это правильно, и 2) я не уверен, как я смогу получить доступ к getSetMethodMap() через параметр типа;

Если я создаю интерфейс ReflectionType с нестационарным методом public Map<String,Method> getMethodMap(); и изменим следующую реализацию на <T extends ReflectionType>, тогда я могу установить методMap .. но это кажется неправильным.

Это моя текущая реализация.

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); 
} 

Я явно не понимаю параметрическую типизацию/тип.

Как это можно очистить?

+0

Не могли бы вы разместить предупреждения (строки и сообщения)? – ssantos

ответ

0

Что касается меня,

<T extends ReflectionType> 

является способ пойти, если вам нужно вызвать определенные методы класса T (как getSetMethodMap в данном случае).

Смежные вопросы