(1)怎么获得method 的信息,为了保证名字相同的参数的替换(或是注入)以及不同类型的转换,我们需要先知道method的参数的类型以及method参数的名字,类型还是很简单的,只需要method.getParameterTypes()能得到method中各个参数的类型,获得参数的名字比较复杂了,为了解决这个问题需要另外一个黑科技:asm。我并没有过于深入的研究框架本身,找到了一个Demo,能够直接获得函数中参数的名字,将asm整合进入框架中,得到该method的2个classNames,paraNames分别为类型名和参数名的集合。
List<String> paraNames= MethodResolver.getMethodNames(clazz.getName(),methodPro.getName());
List<String> classNames= CollectionUtils.classArrToStringList(method.getParameterTypes());
Object[] args=MethodResolver.makeArgs(paraNames,classNames,req,resp,model);
public static List<String> getMethodNames(String className,String methodName) throws IOException {
List<String> list=new ArrayList<String>();
String cn=Config.getProPath()+className.replace(".", "/")+".class";
InputStream is=new FileInputStream(new File(cn));
ClassReader cr = new ClassReader(is);
ReadMethodArgNameClassVisitor classVisitor = new ReadMethodArgNameClassVisitor();
cr.accept(classVisitor, 0);
for(Entry<String, List<String>> entry : classVisitor.nameArgMap.entrySet()) {
if(entry.getKey().equals(methodName)) {
for (String s : entry.getValue()) {
list.add(s);
}
}
}
return list;
}
  (2)怎么将刚才得到的method信息,通过已有的request和response生成一个Object[] args来供反射调用。这里要分成几个策略来进行。遍历classNames,paraNames,对于每一组 参数类型[参数名],如果这个类型是javax.servlet.http.HttpServletRequest,或javax.servlet.http.HttpServletResponse,或ModelMap,直接加入到args中,否则继续判断;如果参数类型为String且参数名在request的ParameterNames中有相同的名字,加入args;不满足的话:判断参数名在request的ParameterNames中有相同的名字,有的话此时肯定不是String,转换类型,不能转换类型的话自动报错,不必处理;不满足的话判断这个类型能否被加载且属性中存在与当前参数名相同的属性:如果满足条件,使用反射生成这个类,并把类中的属性与相同的request的ParameterNames那部分赋值,实现模型类的自动装配并加入args。如果不满足上述所有条件,args加入null。遍历完所有的classNames,paraNames后得到method的参数的被调用数组。
  5.页面路径设置
  在@Controller的代码中会返回页面的名称字符串,在配置文件中配置页面路径和页面后缀能简单的实现页面的转发。
  Object result=method.invoke(clazz.newInstance(),args);
  Map<String,Object> map=model.getMap();
  for(String key:map.keySet())
  {
  req.setAttribute(key,map.get(key));
  }
  if(result instanceof String)
  {
  req.getRequestDispatcher(Config.getConfig("pagePath")+File.separator+result.toString()+Config.getConfig("suffix")).forward(req, resp);
  }
  6.部署
  在框架完成后可以使用IDE自带的功能打成jar包,然后使用 mvn install命令放到本地仓库,新建一个web项目,导入jar包,servlet在程序中写死了拦截*.do请求,因此不必设置web.xml,只需要基本的内容,后面会改,实现可配置。
  <%@ page contentType="text/html;charset=UTF-8" language="java" %>
  <html>
  <head>
  <title>11</title>
  </head>
  <body>
  当前时间:${time}
  </body>
  </html>
  后台的代码是上面那一段代码,这个为jsp的代码,启动tomcat,后效果为

  后:
  这个框架前前后后写了3,4天,加深了annotation,asm,可变长参数,反射,泛型函数以及对MVC本身框架的理解,还是很有收获的。