已经分析过DispatcherServlet主要的任务,分为五个任务,任务1:把项目中所有的bean扫描,进行维护,我们已经完成,现在第二个任务:根据全类名创建bean实例,并进行维护;
其实写到这里就要恶补一下反射的相关知识了:
1.如何通过类的信息,获得这个类的类类型
Class<?> c1 = Class.forName("com.tx.Foo");
2.知道一个类的类类型,可以做什么?
可以创建该类的对象: demo = c1.newInstance();
可以获得该类的所有属性:Field[] fs = c1.getFields()
可以获得该类的所有方法:Method[] methods = c1.getMethods();
可以获得该类的所有构造方法: Constructor[] cs = c1.getConstructors();
3.获得了以上信息可以做什么?
获得了方法就可以通过这个方法对象,通过 method.invoke(对象,参数列表) 调用方法
4.可以通过对象获得类类型吗?答案,当然可以
Foo f1 = new Foo();
c2 = f1.getClass();
5.当然也可以直接通过如下的写法获得类类型:
c3 = Foo.class;
之所以写这么多的反射知识点,是因为,之后的任务中都要大量用到,所以提前预习一下!
任务二,根据全类名创建bean实例,并进行维护;代码如下
//根据扫描的List类名,进行实例化
private void doInstance(){
if(classNames.size()<=0){
System.out.println("包扫描失败");
return;
}
for(String className:classNames){
String cn = className.replace(".class", "");
try {
Class<?> clas = Class.forName(cn);
if(clas.isAnnotationPresent(MyController.class)){
Object instace = clas.newInstance();
MyRequestMapping requestMapping = clas.getAnnotation(MyRequestMapping.class);
String rmvalue = requestMapping.value();
beans.put(rmvalue,instace);
}else if(clas.isAnnotationPresent(MyService.class)){
MyService service = clas.getAnnotation(MyService.class);
Object instance = clas.newInstance();
beans.put(service.value(), instance);
}else{
continue;
}
} catch (ClassNotFoundException e) {
e.printStackTrace();
} catch (InstantiationException e) {
e.printStackTrace();
} catch (IllegalAccessException e) {
e.printStackTrace();
}
}
}
其中维护bean实例,定义了成员变量:
Map<String,Object> beans = new HashMap<String,Object>();
到此任务二完成,如果此段代码中有什么问题,可以在评论中提出!