前提:每个XML元素都有一个id属性和一个class属性
外部调用一个方法,传id参数就可以获取,这个xml元素对应的对象
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;
//实现一个万能查找元素的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里面装的是所有子节点
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); //得到元素对应类的反射对象
}
}
T t = null;
t= (T) clazz.newInstance(); //通过反射对象获得对应类的对象
return t;
}
/*在这里我们发现在获取类对象的时候,是先获得了反射类对象,再通过其对象获得所反射类的对象
这样做的原因也正解释了反射存在的意义:id对应着全类名,我们可以通过知道id的方式获得全类名,得到全类名虽然我们知道了类名,但是不知道构造函数无法直接创建对象,而反射就可以通过先建立反射对象再创建类对象的方法得到这个类的对象。(clsName指代全类名,而无法表示构造函数,所以无法使用new的方法创建对象)*/
}