У меня есть несколько таблиц, которые у меня есть 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);
}
Я явно не понимаю параметрическую типизацию/тип.
Как это можно очистить?
Не могли бы вы разместить предупреждения (строки и сообщения)? – ssantos