个人水平比较菜,没有这么高的实力简单实现springmvc框架,我是看了一个老哥的博客,这老哥才是大神!

  原文链接:https://www.cnblogs.com/xdp-gacl/p/4101727.html

  ok,开始瞎扯一下,我们用springmvc的时候是不是要导入依赖或者是jar包啊,那是由于别人将很多功能都给设计好了,我们直接拿过来用,这有好处也有坏处;好处是用起来很方便,直接用就好了,但是坏处就是封装的太好了我们很难真正的弄清楚其中的运行原理,虽然说可以走源码,但是总是感觉差了一点什么东西。

  反正我走源码就是总感觉有点欠缺,但是又说不上来哪里不对劲,直到现在醒悟了一点,其实就是对原理了解的不够彻底,还有就是源码都是一层套一层,层层封装,走着走着我也不知道上一步做了什么事了,简直就是山路十八弯,哈哈哈。

  瞎扯结束,接下来我根据那个老哥的博客自己稍微整理一下,简单实现一个springmvc的框架,只为更透彻的了解springmvc的原理!

  在看本篇博客之前,可以先忘记以前springmvc的所有东西,我们以 servlet+自定义注解 实现

  新建一个普通的java web项目,我的目录结构如下:

简单实现springmvc框架(servlet+自定义注解)

 

 

1.工具类

  自己简单实现一些什么框架,必不可少的就是要提前准备很多的工具类

  首先就是要把下面这七个工具类准备好,我把代码复制过来;

  1.1 BeanUtils:对反射的一些操作,可以根据传入xxx.Class参数,进行实例化或者找到其中某个方法

package com.wyq.utils;

import java.lang.reflect.Constructor;
import java.lang.reflect.Field;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import java.lang.reflect.Modifier;

/**
 * 对java反射的一些封装
 */
public class BeanUtils {
     /**
     * 实例化一个class 
     */
    public static <T> T instanceClass(Class<T> clazz){
        if(!clazz.isInterface()){
            try {
                return clazz.newInstance();
            } catch (InstantiationException e) {
                e.printStackTrace();
            } catch (IllegalAccessException e) {
                e.printStackTrace();
            }
        }
        return null;
    }
    
    /**
     * 通过构造函数实例化
     *
     */
    public static <T> T instanceClass(Constructor<T> ctor, Object... args)
            throws IllegalArgumentException, InstantiationException, 
            IllegalAccessException, InvocationTargetException{
        makeAccessible(ctor);
        return ctor.newInstance(args);//调用构造方法实例化
    }
    
    /**
     * 查找某个class的方法
     *
     */
    public static  Method findMethod(Class<?> clazz, String methodName, Class<?>... paramTypes){
        try {
            return clazz.getMethod(methodName, paramTypes);
        } catch (NoSuchMethodException e) {
            return findDeclaredMethod(clazz, methodName, paramTypes);//返回共有的方法
        }
    }
    
    public static Method findDeclaredMethod(Class<?> clazz, String methodName, Class<?>[] paramTypes){
        try {
            return clazz.getDeclaredMethod(methodName, paramTypes);
        }
        catch (NoSuchMethodException ex) {
            if (clazz.getSuperclass() != null) {
                return findDeclaredMethod(clazz.getSuperclass(), methodName, paramTypes);
            }
            return null;
        }
    }
    
    public static Method [] findDeclaredMethods(Class<?> clazz){
            return clazz.getDeclaredMethods();
    }
    
    public static void makeAccessible(Constructor<?> ctor) {
        if ((!Modifier.isPublic(ctor.getModifiers()) 
                || !Modifier.isPublic(ctor.getDeclaringClass().getModifiers()))
                && !ctor.isAccessible()) {
            ctor.setAccessible(true);//如果是私有的 设置为true 使其可以访问
        }
    }
    
    public static Field[] findDeclaredFields(Class<?> clazz){
        return clazz.getDeclaredFields();
    }

}
View Code

相关文章: