前提:每個XML元素都有一個id屬性和一個class屬性
外部調(diào)用一個方法,傳id參數(shù)就可以獲取沐飘,這個xml元素對應(yīng)的對象
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Map.Entry;
import java.util.Set;
import org.dom4j.Document;
import org.dom4j.Element;
import org.dom4j.io.SAXReader;
//實現(xiàn)一個萬能查找元素的XML的方法,
public class ClassPathXmlApplicationContextimplements ApplicationContext {
Stringconf = null;
publicClassPathXmlApplicationContext(String conf) {
this.conf= conf;
}
//conf表示的是xml的位置
@Override
public T getBean(String id) throws Exception {
SAXReader reader = new SAXReader();
Document doc = reader.read(conf);
Element ele = doc.getRootElement();
List?list = ele.elements();//list里面裝的是所有子節(jié)點(diǎn)
Map?map = new HashMap<>();
for(Elemente : list){//每個元素都有一個id屬性
String idd =e.attribute("id").getValue();
String className =e.attribute("class").getValue();
map.put(idd, className);//將id值和class值存到map集合里
//id表示類名牲迫,className表示全類名
}
Class clazz = null;
//遍歷map
Set?set = map.entrySet();
for(Entryentry : set)
{
String key = entry.getKey();
System.out.println(key);
if(key.equals(id))
{
String clsName = map.get(key);
clazz = Class.forName(clsName); //得到元素對應(yīng)類的反射對象
}
}
T t = null;
t= (T) clazz.newInstance(); //通過反射對象獲得對應(yīng)類的對象
return t;
}
/*在這里我們發(fā)現(xiàn)在獲取類對象的時候耐朴,是先獲得了反射類對象,再通過其對象獲得所反射類的對象
這樣做的原因也正解釋了反射存在的意義:id對應(yīng)著全類名盹憎,我們可以通過知道id的方式獲得全類名筛峭,得到全類名雖然我們知道了類名,但是不知道構(gòu)造函數(shù)無法直接創(chuàng)建對象陪每,而反射就可以通過先建立反射對象再創(chuàng)建類對象的方法得到這個類的對象影晓。(clsName指代全類名镰吵,而無法表示構(gòu)造函數(shù),所以無法使用new的方法創(chuàng)建對象)*/
}