写在前面
准备手写一个简易版的springmvc,大伙别笑,瞎弄,往下看看,指点一下
1.自定义注解
1.扫描包
2.得到包中所有的.class文件,使用map存储文件的全类名和Class实例
请看这篇https://www.jianshu.com/p/e00c00b52e16
3.判断类是否有Controller注解,和RequestMapping注解,
4.如果有,用map存储,类的全类名和类对象,存储下映射路径
5.判断是否有RequestMapping注解
6.如果有,用map存储,映射路径和method实例
7.根据路径,反射调用类中的方法
https://www.jianshu.com/p/0df260de4b13
前面我们已经写了,如何得到包下所有的类文件呢,https://www.jianshu.com/p/e00c00b52e16,现在我们要判断该类是否有Controller注解
1.自定义注解
定义Controller注解
@Target({ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
public @interface Controller {
}
使用@interface声明注解,
@Target是元注解,即是注解在注解上的,用于声明该注解可以在哪个位置
ElementType.TYPE, 修饰类,接口枚举,注解
ElementType.FIELD, 修饰描述域
ElementType.METHOD 修饰方法
@Retention也是元注解,用于声明该注解在什么时候可见,
RetentionPolicy.RUNTIME 运行时可见,反射的基础
RetentionPolicy.CLASS 在字节码可见
RetentionPolicy.SOURCE 只在源文件存在
定义RequestMapping注解
2.判断是否是Controller
3.2判断类上是否有Controller注解,判断方法上是否有RequestMapping注解,得到方法的映射路径
image.png
成功得到Controller,和前面一篇得到包中所有的类结合
3.综合版
public static HashMap<String,Object> controllerMap = new HashMap<String,Object>();
public static HashMap<String,Method> methodMap = new HashMap<String,Method>();
public static void initServer(String packageName){
//存放类路径与类对象
HashMap<String, Class<?>> ClassHashMap = ScannerUtils.scannerPackage(packageName);
Iterator<String> iterator = ClassHashMap.keySet().iterator();
while (iterator.hasNext()){
//遍历map, 根据key得到类的实例对象
String className = iterator.next();
Class aClass = ClassHashMap.get(className);
//如果是controller
if (aClass.isAnnotationPresent(Controller.class)){
System.out.println(aClass.getName()+"被标记为控制器...");
//一个方法的全映射路径
String path="";
//如果有RequestMapping注解
if (aClass.isAnnotationPresent(RequestMapping.class)){
//RequestMapping annotation = (RequestMapping) aClass.getAnnotation(RequestMapping.class);
String s = ((RequestMapping) aClass.getAnnotation(RequestMapping.class)).value()[0];
path=SpliteUtils.spliteUrl(s);
}
//将该controller对象实例存入map,key是controller中的RequestMapping
try {
controllerMap.put(className,aClass.newInstance());
} catch (InstantiationException e) {
e.printStackTrace();
} catch (IllegalAccessException e) {
e.printStackTrace();
}
//得到类中的所有方法
Method[] methods = aClass.getMethods();
for (Method method: methods){
if (method.isAnnotationPresent(RequestMapping.class)){
//如果方法有映射
String s = method.getAnnotation(RequestMapping.class).value()[0];
String methodPath = path+ SpliteUtils.spliteUrl(s);
System.out.println("映射路径:"+methodPath);
methodMap.put(methodPath,method);
}
}
}
}
}
1.先调用扫描包,得到包中所有的类文件
2.遍历类文件,判断是否是controller,如果是,使用hashmap添加该controller的全类名和实例对象,判断类上是否有RequestMapping注解,得到映射路径
3.判断类中的方法是否有RequestMapping注解,得到映射路径,添加映射路径和方法到hashmap
这样就得到了所有的controller和方法的映射路径,
QQ群:552113611
网友评论