自定义框架(3)

接上述,

我们通过注解已经可以加载自己创建的后端控制器,但如果我们需要把用户请求交给我们的某一个控制器,我们还得为控制器起一个名字,即在加一个带值注解

在此我创建了一个RequestMapper注解类

这个注解既可以作用在类头上,也可以作用在方法头上;

用户访问服务器是通过url(地址)来访问,我们自定义的框架里的控制器要想让servlet根据用户输入的url访问到我我们的控制器,和具体方法,我们得先给我们的控制器,和方法通过RequestMapper直接为控制器类和控制器里的方法去一个名字。

我们不知到用户会访问我们那个控制器中的那个具体方法,所以我们要提前将用户可能访问的的所有控制器的具体方法名字,与其对应的控制器类实例,和对应的具体方法,用两个集合装起来。

具体实现:

上一篇说到我们已经通过反射将含有controller注解的控制器类实例并用容器装了起来,

接下来我们将得到装控制类实例与类名称的map容器.entryset(),将map转换为set集合

循环获取set的value值,即控制器类实例,再用得到的类实例.class()方法得到类对象,

得到的类对象.isAnnotationPresent(“RequestMapper.class”)判断这些类实例中是否含有RequestMapper注解

如果有我们在通过类实例.getAnnotation(RequestMapper.class)得到requestMapper注解类,

.value()方法得到注解的值,将其用一个字符串保存起来,

 接下来我们实例化这个类,用一个oBject装起来,备用,

接下来通过反射,使用类对象.getMethods(),返回一个方法数组

获取到当前类的所有方法,循环取出方法,并判断,其方法头上是否用Request注解,如果有,一样获取到注解,.value()方法得到注解的值,和上面类头上注解的值加在一起,我们就得到了访问我们控制器的具体以方法的地址,也是唯一标识符,

将得到的地址,和这个方法装在一个map集合中,key为:地址 ,value为:方法 以便通过这个地址就能得到这个方法,

再将这个地址与上面实例出的object存在一个map集合中,key为:地址    ,value为:obj对象。因反射调用方法时需要传递调用那个对象的方法

 

猜你喜欢

转载自www.cnblogs.com/zxc-double-refuel/p/10835797.html