简单仿写MVC

代码地址(需要自取):mvc_Imitation: 简单仿写实现MVC (gitee.com)

项目目录

先把架子搭好

Controller注解

@Documented
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.TYPE)
public @ interface Controller {
}

RequestMapping

@Documented
@Retention(RetentionPolicy.RUNTIME)
@Target({ElementType.TYPE,ElementType.METHOD})
public @interface RequestMapping {/**** @return*/String value() default "";
}

HydController

@Controller
@RequestMapping("hyd")
public class HydController {@RequestMappingpublic  String index(){System.out.println("RequestMapping为“hyd, ”的方法已执行");return "";}@RequestMapping("hyd2")public  String index1(){System.out.println("RequestMapping为“hyd,hyd2”的方法已执行");return "";}
}

indexController

@Controller
@RequestMapping
public class IndexController {@RequestMappingpublic void index() {System.out.println("RequestMapping为“ , ”的方法已执行");}
}

Main

public class Main {static {
//        获取Main的路径String path = Main.class.getResource("").getPath();
//        获取Main的包名String packageName = Main.class.getPackage().getName();HydMVC.scanner(path, packageName);}public static void main(String[] args) {HydMVC.mehtod_go("","");HydMVC.mehtod_go("hyd","");HydMVC.mehtod_go("hyd","hyd2");HydMVC.mehtod_go("232323","23131");HydMVC.mehtod_go("hyd","23131");}}

HydMVC

public class HydMVC {
//    存放 一级注解-二级注解-方法 的mapprivate static HashMap<String,HashMap<String, Method>> map_method = new HashMap<>();
//    存放 一级注解-类的实例化对象 的mapprivate static HashMap<String, Object> map_object = new HashMap<>();/*** 方法执行函数* @param first_path 第一路径* @param second_path 第二路径*/public static void mehtod_go(String first_path,String second_path){
//        如果map_object中没有fisrt_path,则不存在该注解的类if (map_object.get(first_path)==null){System.out.println("没有一个类有"+first_path+"注解");}else {if (map_method.get(first_path).get(second_path)==null){System.out.println(first_path+"下没有"+second_path+"注解"+"的方法");}else{try {map_method.get(first_path).get(second_path).invoke(map_object.get(first_path));} catch (IllegalAccessException e) {e.printStackTrace();} catch (InvocationTargetException e) {e.printStackTrace();}}}}/*** 扫描获取类实例化对象以及方法* @param path* @param packageName 包名*/public static void scanner(String path,String packageName){
//        扫描当前所有的文件List<String> paths = traverseFolder2(path);
//        遍历拿到的文件路径for (String path1 : paths) {
//              path1为:C:\ttt\imitating_spring_mvc\out\production\imitating_spring_mvc\com\heaboy\IndexController.class
//              先拿到文件名 例:IndexController.classpath1=path1.substring(path.length()-1);try{//            构建类名
//            因为可能存在多级路径,例如:www/IndexController.class,所以还需要进行一些小处理,不能直接拼接
//            File.separator代表文件分隔符
//            Matcher.quoteReplacement确保了文件分隔符在替换过程中被正确地转义,以防包含任何正则表达式的特殊字符。它返回一个适合用于正则表达式替换的字符串。String ClassName = packageName + "." + path1.replaceAll(Matcher.quoteReplacement(File.separator),".");
//            去掉文件名中的.class后缀String load_className = ClassName.replace(".class","");
//            通过类加载器加载类Class<?> cl = ClassLoader.getSystemClassLoader().loadClass(load_className);
//            用写好的检查注解方法(isController)判断cl是否有Controller注解if(isController(cl)){
//              用写好的检查注解方法(isRequestMapping)判断cl是否有RequestMapping注解if (isRequestMapping(cl)){
//                    如果有就获取类上RequestMapping注解的实例RequestMapping requestMapping_first = getRequestMapping(cl);
//                    判断map_method中是否已经存在了该一级注解if (map_method.containsKey(requestMapping_first.value())){
//                        已经存在该一级注解,则抛出异常throw new RuntimeException("包含多个注解:"+requestMapping_first.value());}else {
//                        不存在,添加至map_method中map_method.put(requestMapping_first.value(),new HashMap<>());
//                        添加类的实例化对象到map_object.put(requestMapping_first.value(),cl.newInstance());}
//                    获取类中所有的方法Method[] declareMethods = cl.getDeclaredMethods();
//                    遍历所有方法for (Method method : declareMethods) {if (isRequestMapping(method)){RequestMapping requestMapping_second = getRequestMapping(method);
//                            判断该二级注解是否已经存在if (map_method.get(requestMapping_first.value()).containsKey(requestMapping_second.value())){
//                                存在抛出错误throw new RuntimeException("方法注解已经存在:"+requestMapping_second.value());}else {
//                                不存在就将方法放入map_methodmap_method.get(requestMapping_first.value()).put(requestMapping_second.value(),method);}}}}else{throw new RuntimeException("该类有没RequestMapping注解");}}}catch (Exception e){System.out.println(e);}}}/*** 扫描文件* @param path 绝对路径* @return List<String> 文件绝对路径集合* C:\ttt\imitating_spring_mvc\out\production\imitating_spring_mvc\com\heaboy\IndexController.class*/private static List<String> traverseFolder2(String path) {
//        当前路径下的文件和文件夹File file = new File(path);
//        返回的文件集合List<String> file_list = new ArrayList<>();if (file.exists()){
//            放文件夹LinkedList<File> list = new LinkedList<>();//            存储过程中要处理的文件File[] files = file.listFiles();for (File file1 : files) {
//                如果当前文件是文件夹就把它放到list里面if (file1.isDirectory()){list.add(file1);}else { //不是就将该文件的绝对路径放到返回列表中file_listfile_list.add(file1.getAbsolutePath());}}
//            申请一个临时变量File file_temp;
//            当存放文件夹的队列不为空时,执行以下操作while (!list.isEmpty()){
//                取出第一个文件夹来处理file_temp=list.removeFirst();
//                使用上面申请的FIle[]来存放file_temp中的文件files=file_temp.listFiles();
//                处理files中的文件,同上,文件夹放到list中,文件放到file_list中for (File file1 : files) {if (file1.isDirectory()){list.add(file1);}else {file_list.add(file1.getAbsolutePath());}}}}else{
//            如果没有任何文件,则不做处理}return file_list;}//    判断类是否有Controller注解private static boolean isController(Class cl){Annotation annotation = cl.getAnnotation(Controller.class);if(annotation!=null){return  true;}return false;}//    判断类是否有RequestMapping注解private static boolean isRequestMapping(Class cl){Annotation annotation = cl.getAnnotation(RequestMapping.class);if(annotation!=null){return  true;}return false;}
//    获取类的RequestMapping注解的实例private static RequestMapping getRequestMapping(Class<?> cl) {Annotation annotation = cl.getAnnotation(RequestMapping.class);if (annotation instanceof  RequestMapping){return (RequestMapping) annotation;}return null;}//    判断方法是否有RequestMapping注解private static boolean isRequestMapping(Method method) {Annotation annotation = method.getAnnotation(RequestMapping.class);if (annotation!=null){return true;}return false;}
//    获取方法上的RequestMapping注解的实例private static RequestMapping getRequestMapping(Method method) {Annotation annotation  = method.getAnnotation(RequestMapping.class);if (annotation instanceof RequestMapping){return (RequestMapping) annotation;}return null;}}

整体思路流程,先对路径下的文件进行扫描,拿到.class后缀的文件,然后根据不同的注解进行不同的操作,将实例化对象和方法都存到map中,再从map中获取调用。具体详细的解释可以查看代码及其注释。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/bicheng/43629.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

大模型lora微调中,rank参数代表什么,怎么选择合适的rank参数

在大模型的LoRA&#xff08;Low-Rank Adaptation&#xff09;微调中&#xff0c;rank参数&#xff08;秩&#xff09;是一个关键的超参数&#xff0c;它决定了微调过程中引入的低秩矩阵的维度。具体来说&#xff0c;rank参数r表示将原始权重矩阵分解成两个低秩矩阵的维度&#…

互助学习平台小程序的设计

管理员账户功能包括&#xff1a;系统首页&#xff0c;个人中心&#xff0c;学生管理&#xff0c;课程信息管理&#xff0c;课程分类管理&#xff0c;课程评价管理&#xff0c;学习计划管理&#xff0c;留言板管理 微信端账号功能包括&#xff1a;系统首页&#xff0c;课程信息…

Databend 开源周报第 152 期

Databend 是一款现代云数仓。专为弹性和高效设计&#xff0c;为您的大规模分析需求保驾护航。自由且开源。即刻体验云服务&#xff1a;https://app.databend.cn 。 Whats On In Databend 探索 Databend 本周新进展&#xff0c;遇到更贴近你心意的 Databend。 支持内置 UDFs …

数学建模美赛入门

数学建模需要的学科知识 高等数学线性代数 有很多算法的掌握是需要高等数学和线代的相关知识 如&#xff1a;灰色预测模型需要微积分知识&#xff1b;神经网络需要用到导数知识&#xff1b;图论和层次分析法等都需要用到矩阵计算的相关知识等&#xff1b; 概率论与数理统计&am…

忘记Apple ID密码怎么退出苹果ID账号?

忘记Apple ID密码怎么退出账号&#xff1f;Apple ID对每个苹果用户来说都是必不可少的&#xff0c;没有它&#xff0c;用户就不能享受iCloud、App Store、iTunes等服务。苹果手机软件下载、丢失解锁、恢复出厂设置等都需要使用Apple ID。如果忘记Apple ID 密码&#xff0c;这会…

Flutter 开启混淆打包apk,并反编译apk确认源码是否被混淆

第一步&#xff1a;开启混淆并打包apk flutter build apk --obfuscate --split-debug-info./out/android/app.android-arm64.symbols 第二步&#xff1a;从dex2jar download | SourceForge.net 官网下载dex2jar 下载完终端进入该文件夹&#xff0c;然后运行以下命令就会在该…

分享五款软件,成为高效生活的好助手

​ 给大家分享一些优秀的软件工具,是一件让人很愉悦的事情&#xff0c;今天继续带来5款优质软件。 1.图片放大——Bigjpg ​ Bigjpg是一款图片放大软件&#xff0c;采用先进的AI算法&#xff0c;能够在不损失图片质量的前提下&#xff0c;将低分辨率图片放大至所需尺寸。无论…

Windows10 企业版 LTSC 2021发布:一键点击获取!

Windows10企业版 LTSC 2021是微软发布的长达5年技术支持的Win10稳定版本&#xff0c;追求稳定的企业或者个人特别适合安装该系统版本。该版本离线制作而成&#xff0c;安全性高&#xff0c;兼容性出色&#xff0c;适合新老机型安装&#xff0c;力求带给用户更稳定、高效的操作系…

【第24章】MyBatis-Plus之SQL注入器

文章目录 前言一、概述1. 使用场景2. 功能 二、注入器配置三、自定义全局方法攻略1. 定义SQL2. 注册自定义方法3.定义BaseMapper4.配置SqlInjector 四、注意事项五、更多示例六、实战1. 定义SQL2. 注册自定义方法3.定义BaseMapper4.配置SqlInjector5. 测试类6. 结果 总结 前言 …

Linux开机自启动连接wifi

&#x1f308;个人主页&#xff1a;Rookie Maker &#x1f525; 系列专栏&#xff1a;Linux &#x1f3c6;&#x1f3c6;关注博主&#xff0c;随时获取更多关于IT的优质内容&#xff01;&#x1f3c6;&#x1f3c6; &#x1f600;欢迎来到我的代码世界~ &#x1f601; 喜欢的…

P8306 【模板】字典树

题目描述 给定 n 个模式串 s1​,s2​,…,sn​ 和 q 次询问&#xff0c;每次询问给定一个文本串 ti​&#xff0c;请回答 s1​∼sn​ 中有多少个字符串 sj​ 满足 ti​ 是 sj​ 的前缀。 一个字符串 t 是 s 的前缀当且仅当从 s 的末尾删去若干个&#xff08;可以为 0 个&#…

2.贪心算法.基础

2.贪心算法.基础 基础知识题目1.分发饼干2.摆动序列3.最大子序和4.买股票的最佳时机24.2.买股票的最佳时机5.跳跃游戏5.1.跳跃游戏26.K次取反后最大化的数组和7.加油站8.分发糖果 基础知识 什么是贪心? 贪心的本质是选择每一阶段的局部最优&#xff0c;从而达到全局最优。 贪…

面试经典 106. 从中序与后序遍历序列构造二叉树

最近小胖开始找工作了&#xff0c;又来刷苦逼的算法了 555 废话不多说&#xff0c;看这一题&#xff0c;上链接&#xff1a;https://leetcode.cn/problems/construct-binary-tree-from-inorder-and-postorder-traversal/description/?envTypestudy-plan-v2&envIdtop-inte…

CentOS 8升级gcc版本

1、查看gcc版本 gcc -v发现gcc版本为8.x.x&#xff0c;而跑某个项目的finetune需要gcc-9&#xff0c;之前搜索过很多更新gcc版本的方式&#xff0c;例如https://blog.csdn.net/xunye_dream/article/details/108918316?spm1001.2014.3001.5506&#xff0c;但执行指令 sudo yu…

如何从 Vue 2 无痛升级到 Vue 3,一文搞定!

大家好,我是CodeQi! 一位热衷于技术分享的码仔。 随着 Vue 3 的发布,许多开发者都面临着从 Vue 2 升级到 Vue 3 的挑战。 本文将详细介绍如何从 Vue 2 无痛升级到 Vue 3,包括每个步骤的详细说明与代码示例。 让我们开始吧! 准备工作 在正式开始升级之前,请确保你已经…

纳米级材料尺寸如何测量?

在纳米显微测量领域&#xff0c;基于纳米传动与扫描技术、白光干涉与高精度3D重建技术、共聚焦测量等技术积累&#xff0c;具有自主知识产权的白光干涉仪&#xff08;Z向分辨率可高达0.1纳米&#xff09;和共聚焦显微镜&#xff0c;广泛应用于半导体、3C电子、高校科研等行业领…

VMware安装centos9详细教程(保姆级)

前言 centos9最新的centos版本&#xff0c;在近期的使用中发现它的操作界面与以往的centos7/8更加舒适&#xff0c;界面优化更加精细 项目终止日期&#xff08;EOL&#xff09; 从公告可知&#xff0c;CentOS 项目重心从 CentOS Linux 转移到了 CentOS Stream。下面是各个项…

机场公厕厕位指引屏,布线简单,安装便捷

在人潮涌动的机场&#xff0c;公厕不仅是旅客的必需设施&#xff0c;更是衡量机场服务质量的重要指标。然而&#xff0c;传统机场公厕往往存在信息不透明、清洁维护滞后、高峰期拥挤等问题&#xff0c;严重影响了旅客的使用体验。近年来&#xff0c;随着智慧机场理念的兴起&…

【方法】如何打开设置了密码的ZIP文件?

对于重要的ZIP文件&#xff0c;很多人会设置密码保护&#xff0c;那要如何打开设置了密码的ZIP文件呢&#xff1f;今天我们一起来看下&#xff0c;在记得密码和忘记密码的情况下&#xff0c;如何打开ZIP文件。 情况1&#xff1a; 如果知道ZIP文件原本设置的密码&#xff0c;我…

Excel第28享:如何新建一个Excel表格

一、背景需求 小姑电话说&#xff1a;要新建一个表格&#xff0c;并实现将几个单元格进行合并的需求。 二、解决方案 1、在电脑桌面上空白地方&#xff0c;点击鼠标右键&#xff0c;在下拉的功能框中选择“XLS工作表”或“XLSX工作表”都可以&#xff0c;如下图所示。 之后&…