在构建路由框架的过程中,我们需要以下几个主要的步骤:
首先,我们定义一个名为Router
的自定义注解,用于标记控制器方法并映射方法和URL路径。这个注解包含两个属性:name
表示接口名称,path
表示接口地址。
package com.learn.annotation;
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
// Target注解设置Router注解只可用于方法中
@Target(ElementType.METHOD)
// Retention注解设置Router只可用于运行时
@Retention(RetentionPolicy.RUNTIME)
public @interface Router {
/**
* 接口名称
*/
String name();
/**
* 接口地址
*/
String path();
}
接下来,我们创建一个控制器类ApiController
,其中包含用Router
注解标记的不同接口方法。
package com.learn.controller;
import com.learn.annotation.Router;
public class ApiController {
/**
* 注册接口
*/
@Router(name = "注册接口", path = "/api/register")
public void register() {
System.out.println("注册成功");
}
/**
* 登录接口
*/
@Router(name = "登录接口", path = "/api/login")
public void login() {
System.out.println("登录成功");
}
}
在入口函数中,我们使用反射来获取控制器中的所有方法,并提取使用了Router
注解的方法的信息,包括接口名称、接口地址和调用的方法名。
import com.learn.annotation.Router;
import java.lang.reflect.Method;
public class Main {
public static void main(String[] args) throws ClassNotFoundException {
// 假设整个系统所有的控制器都需要写在ApiController中
String className = "com.learn.controller.ApiController";
// 获取反射对象
Class<?> clazz = Class.forName(className);
// 获取对象的全部方法
Method[] methods = clazz.getMethods();
// 循环对象所有方法
for (Method method : methods) {
// 检查方法是否包含Router注解
if (method.isAnnotationPresent(Router.class)) {
// 读取方法的注解信息
Router router = method.getAnnotation(Router.class);
// 提取接口名称信息
String apiName = router.name();
// 提取接口地址信息
String apiPath = router.path();
// 提取接口方法名称
String funcName = method.getName();
// 输出信息
StringBuilder sb = new StringBuilder();
sb.append("接口名称:" + apiName + "\r\n");
sb.append("接口地址:" + apiPath + "\r\n");
sb.append("调用方法:" + funcName + "\r\n");
System.out.println(sb.toString());
}
}
}
}
在这篇博客中,我们演示了如何使用自定义注解和反射获取每个路由地址指向的控制器方法,由于篇幅原因不再去编写http请求部分和解析url部分。如果你有任何疑问或想要更进一步的讨论,请随时提问!
字节(Byte)是计量单位,表示数据量多少,是计算机信息技术用于计量存储容量的一种计量单位,通常情况下一字节等于八位。字符(Character)计算机中使用的字母、数字、字和符号,比如'A'、'B'、'$'、'&'等。一般在英文...
java一个类可以有多个构造方法,根据传参类型和个数来匹配执行哪个构造方法。public class Member { public Member(){  ...
(1).final 修饰符通常和 static 修饰符一起使用来创建类常量。(2).父类中的 final 方法可以被子类继承,但是不能被子类重写,声明 final 方法的主要目的是防止该方法的内容被修改。public class Member {  ...
在java中字符串属于对象,刚开始我就疑惑为什么int char等类型都是小写,结果String是大写,java太反人类,后来才知道String是对象。(1).java创建字符串String text = "net"; String tex...
(1).java获取当前日期时间Date date = new Date(); System.out.println(date.toString());输出Fri Jul 02 10:29:55 CST 2021(2).java获取时间戳秒/毫秒D...
(1).java睡眠函数Thread.sleep(时间); //单位为毫秒(2).java睡眠函数例子Date dNow = new Date(); SimpleDateFormat ft = new&nbs...