面向分析师的叙事性图表:AI 自动生成故事线与关键拐点标注
2026/9/27 8:11:20
来了,这一篇我们直接走**“从 0 到能写框架级代码”的路线 😎
不是只讲语法,而是注解 + 反射 = 真正能干活的武器**
一句话定位:
看完这篇,你能读懂 Spring 注解原理,也能自己造一个轻量框架
先看一个熟到不能再熟的东西👇
@RestController@RequestMapping("/user")publicclassUserController{}问题是:
👉 本质公式:
注解 = 元数据
反射 = 读取 + 执行元数据
注解是一种写在代码里的结构化配置
@Override✔ 不影响代码逻辑
✔ 可被工具 / 框架读取
✔ 比 XML / 配置文件更安全
| 位置 | Target |
|---|---|
| 类 | TYPE |
| 方法 | METHOD |
| 成员变量 | FIELD |
| 参数 | PARAMETER |
| 构造器 | CONSTRUCTOR |
@Target(ElementType.METHOD)@Retention(RetentionPolicy.RUNTIME)public@interfaceMyAnnotation{}| 元注解 | 作用 |
|---|---|
| @Target | 注解能用在哪 |
| @Retention | 生命周期 |
| @Documented | 是否进 javadoc |
| @Inherited | 子类是否继承 |
| 类型 | 说明 |
|---|---|
| SOURCE | 编译后丢弃 |
| CLASS | 编译进 class,不运行 |
| RUNTIME | 运行期可反射(最重要) |
📌只要和反射有关,必须是 RUNTIME
@Target(ElementType.METHOD)@Retention(RetentionPolicy.RUNTIME)public@interfaceLog{Stringvalue()default"";}规则:
@Log("用户登录")publicvoidlogin(){}Class<?>clazz=UserService.class;Methodmethod=clazz.getDeclaredMethod("login");Loglog=method.getAnnotation(Log.class);System.out.println(log.value());👉注解此刻才真正“生效”
@Log@Target(ElementType.METHOD)@Retention(RetentionPolicy.RUNTIME)public@interfaceLog{Stringvalue();}publicclassUserService{@Log("执行登录逻辑")publicvoidlogin(){System.out.println("login...");}}publicclassLogProcessor{publicstaticvoidprocess(Objectobj)throwsException{Class<?>clazz=obj.getClass();for(Methodmethod:clazz.getDeclaredMethods()){if(method.isAnnotationPresent(Log.class)){Loglog=method.getAnnotation(Log.class);System.out.println("日志:"+log.value());method.invoke(obj);}}}}LogProcessor.process(newUserService());🎉一个注解驱动功能完成
@NotNull@Length(max=20)@RequireRole("ADMIN")@InjectprivateUserServiceuserService;@RequestMapping("/login")约定 > 配置 > 注解
| 对比 | 注解 | 接口 |
|---|---|---|
| 是否有逻辑 | ❌ | ❌ |
| 是否强约束 | ❌ | ✅ |
| 主要用途 | 元数据 | 行为规范 |
📌注解不参与继承体系
1️⃣ 忘记Retention.RUNTIME
2️⃣ 用反射却拿不到注解
3️⃣getMethodvsgetDeclaredMethod混用
4️⃣ 注解不是魔法,没反射=没用
5️⃣ 过度设计,小项目别滥用
注解是标签,反射是解释器
没有反射,注解只是注释
我可以直接带你:
你想往框架原理 / 实战项目 / 面试突击哪个方向继续?