面试题答案
一键面试实现思路
- 定义自定义注解:创建一个用于标注控制器方法的自定义注解,在注解中定义必要的属性,如路由路径等。
- 编写注解处理器:通过继承
AbstractProcessor
类,重写process
方法,在该方法中扫描项目中的所有类,找到带有自定义注解的方法,并解析注解中的信息,生成路由映射表。 - 存储路由映射表:可以使用
Map
等数据结构来存储路由映射关系,其中键为路由路径,值为对应的控制器方法的反射对象等相关信息,以便后续根据路由路径调用对应的方法。 - 在Web框架中集成:在框架的启动阶段,触发注解处理器工作,生成路由映射表,并在接收到请求时,根据请求的URL在路由映射表中查找对应的处理方法并执行。
关键代码片段
- 定义自定义注解
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
@Retention(RetentionPolicy.SOURCE)
@Target(ElementType.METHOD)
public @interface Route {
String value();
}
- 编写注解处理器
import javax.annotation.processing.*;
import javax.lang.model.SourceVersion;
import javax.lang.model.element.Element;
import javax.lang.model.element.ElementKind;
import javax.lang.model.element.TypeElement;
import java.util.HashMap;
import java.util.Map;
import java.util.Set;
@SupportedAnnotationTypes("Route")
@SupportedSourceVersion(SourceVersion.RELEASE_8)
public class RouteProcessor extends AbstractProcessor {
private Map<String, Element> routeMap = new HashMap<>();
@Override
public boolean process(Set<? extends TypeElement> annotations, RoundEnvironment roundEnv) {
for (Element element : roundEnv.getElementsAnnotatedWith(Route.class)) {
if (element.getKind() == ElementKind.METHOD) {
Route route = element.getAnnotation(Route.class);
routeMap.put(route.value(), element);
}
}
return true;
}
}
- 使用注解的示例控制器类
public class UserController {
@Route("/user/list")
public void listUsers() {
// 处理用户列表请求的逻辑
}
}
上述代码仅是简单示例,实际应用中还需考虑更多细节,如错误处理、支持更多注解属性、与Web框架其他部分的集成等。