java注解配合反射是实现轻量级自定义框架的核心机制:注解声明意图,反射读取并执行。需用@interface定义、@target和@retention(runtime)声明作用范围与生命周期,运行时扫描类方法获取注解,提取属性构建路由表等,并在请求时依元数据触发权限校验、参数绑定等行为。

Java 注解配合反射是实现轻量级自定义框架的核心机制——注解负责“声明意图”,反射负责“读取并执行意图”。关键在于:在运行时通过反射获取类、方法、字段上的注解信息,再根据注解元数据触发对应逻辑(如自动注入、权限校验、路由映射等)。
定义和使用自定义注解
先用 @interface 声明注解,并设置作用范围(@Target)和生命周期(@Retention)。例如定义一个用于标记控制器方法的路由注解:
- @Target(ElementType.METHOD) 表示只能用在方法上
- @Retention(RetentionPolicy.RUNTIME) 表示注解保留到运行期,反射才能读取
- 支持属性(如 value() default "/"),便于配置化
用反射扫描并解析注解
框架启动时(或首次请求前),遍历指定包下的所有类,对每个类及其方法调用 getDeclaredAnnotations() 或 getAnnotation(YourAnno.class)。常用步骤:
- 用 ClassLoader 加载包下所有 .class 文件,或借助 org.reflections 等工具快速扫描
- 对每个 Class 调用 getMethods(),再对每个 Method 调用 getAnnotation(PathVariable.class)
- 若注解存在,提取其属性值(如 anno.value()),存入路由表、拦截器列表等内存结构中
基于注解元数据触发运行时行为
真正起作用的是“执行阶段”。比如 Web 框架收到请求后,根据路径匹配到带 @GetMapping("/user") 的方法,再做以下事情:
- 用反射调用该方法前,检查是否被 @RequiresRole("admin") 标记,做权限拦截
- 若方法参数有 @RequestBody,就用 JSON 反序列化请求体并赋值
- 若返回值类型是 String 且方法有 @ResponseBody,则直接写入响应体而非跳转视图
注意事项和常见陷阱
反射 + 注解看似简单,实际落地要注意几个关键点:
- 注解必须声明为 RUNTIME,CLASS 或 SOURCE 无法在运行时获取
- 私有方法、父类继承的方法默认不被 getMethods() 返回,要用 getDeclaredMethod() 并设 setAccessible(true)
- 大量反射调用影响性能,建议启动时缓存解析结果(如 Method + 注解映射表),避免每次请求重复扫描
- 注解本身不能包含逻辑,所有行为必须由框架代码显式实现——注解只是“开关”或“配置载体”
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











