對於Spring架構的簡單類比:
a).讀取xml設定檔
b.)利用java反射機制擷取對象
第一步:建立一個介面,定義一個擷取對象的方法getBean():
public interface BeanFactory {public Object getBean(String name);}
第二步:建立一個類XmlContext,實現Beanfactory介面中的getBean方法:
public class XmlContext implements BeanFactory {// 對象名加對象執行個體private Map<String, Object> beans = new HashMap<String, Object>();// 利用jdom讀取xml檔案擷取對象名,通過反射擷取對象public XmlContext() throws Exception {SAXBuilder builder = new SAXBuilder();InputStream file = new FileInputStream("test.xml");Document document = builder.build(file);// 獲得文檔對象Element root = document.getRootElement();// 獲得根節點List<Element> list = root.getChildren();for (Element elements : list) {// 擷取屬性值,即為對象的名字String ObjectName = elements.getAttributeValue("id");// 在擷取類的路徑,在通過java反射擷取類的類類型,在擷取該類的對象String classpath = elements.getAttributeValue("class");Object obj = Class.forName(classpath).newInstance();beans.put(ObjectName, obj);// 擷取子節點下的property節點List<Element> eles = elements.getChildren("property");// 進行遍曆for (Element e : eles) {String proName = e.getAttributeValue("name");Object beanObj = this.getBean(e.getAttributeValue("bean"));System.out.println(beanObj.toString());// 然後調用service的構造方法String methodName = "set"+ proName.substring(0, 1).toUpperCase()+ proName.substring(1);System.out.println("methodName:" + methodName);// 通過反射擷取構造方法Method method = obj.getClass().getMethod(methodName,beanObj.getClass().getInterfaces()[0]);method.invoke(obj, beanObj);}}}@Overridepublic Object getBean(String name) {return beans.get(name);}}