我没有看到需要具有如此基本要求的框架,但是我可能无法完全理解您的需求。我最初会从像 SAX 解析处理程序这样简单的东西开始。完全手工编码和未经测试,但基本的想法见这里:
import org.xml.sax.SAXException;
import org.xml.sax.helpers.DefaultHandler;
class XmlHandler extends DefaultHandler {
Map msgClasses = new HashMap(){{ put("uniqueAttribute1", "Foo"); put("someStuff", "Bar"); }};
public MessageBase messageFromAttributes(final org.xml.sax.Attributes attributes) {
for(int i=0; i<attributes.getLength(); i++) {
if(msgClasses.contains(attributes.getValue(i))) {
try{
Class msgClass = Class.forName(attributes.getValue(i));
return msgClass.newInstance();
} catch(ClassNotFoundException e) {
return null;
}
}
}
}
@Override
public final void startElement(String uri, String localName, String name,
final org.xml.sax.Attributes attributes) throws SAXException {
if (localName.equals("msg")) {
MessageBase message = messageFromAttributes(attributes);
}
}
@Override
public final void endElement(String uri, String localName, String name) throws SAXException {
if (localName.equals("msg")) {
}
}
}
我上面示例的想法是将类名映射到特定属性,然后在处理 SAX 解析事件时实例化查找映射中应该指向正确类名的任何给定属性。此时,您可以使用反射实例化该类并继续。如有必要,您可以选择使用剩余的属性值填充类。