news 2026/9/24 7:31:22

Java 注解与反射实战:自定义注解从入门到精通

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
Java 注解与反射实战:自定义注解从入门到精通

来了,这一篇我们直接走**“从 0 到能写框架级代码”的路线 😎
不是只讲语法,而是
注解 + 反射 = 真正能干活的武器**


Java 注解与反射实战

自定义注解从入门到精通

一句话定位
看完这篇,你能读懂 Spring 注解原理,也能自己造一个轻量框架


一、为什么 Java 离不开注解 + 反射?

先看一个熟到不能再熟的东西👇

@RestController@RequestMapping("/user")publicclassUserController{}

问题是:

  • Java本身不会“认识”注解
  • 真正起作用的,是——反射

👉 本质公式:

注解 = 元数据
反射 = 读取 + 执行元数据


二、注解基础速通(必须掌握)

1️⃣ 注解是什么?

注解是一种写在代码里的结构化配置

@Override

✔ 不影响代码逻辑
✔ 可被工具 / 框架读取
✔ 比 XML / 配置文件更安全


2️⃣ 注解能写在哪?

位置Target
TYPE
方法METHOD
成员变量FIELD
参数PARAMETER
构造器CONSTRUCTOR

三、元注解(定义注解的注解)⭐ 必背

@Target(ElementType.METHOD)@Retention(RetentionPolicy.RUNTIME)public@interfaceMyAnnotation{}

四大核心元注解

元注解作用
@Target注解能用在哪
@Retention生命周期
@Documented是否进 javadoc
@Inherited子类是否继承

Retention 三种级别(高频考点)

类型说明
SOURCE编译后丢弃
CLASS编译进 class,不运行
RUNTIME运行期可反射(最重要)

📌只要和反射有关,必须是 RUNTIME


四、自定义注解入门(动手)

1️⃣ 定义一个注解

@Target(ElementType.METHOD)@Retention(RetentionPolicy.RUNTIME)public@interfaceLog{Stringvalue()default"";}

规则:


2️⃣ 使用注解

@Log("用户登录")publicvoidlogin(){}

五、反射基础(注解的发动机)

1️⃣ 获取 Class 对象

Class<?>clazz=UserService.class;

2️⃣ 获取方法 & 注解

Methodmethod=clazz.getDeclaredMethod("login");Loglog=method.getAnnotation(Log.class);System.out.println(log.value());

👉注解此刻才真正“生效”


六、完整实战:自定义日志注解 ⭐⭐⭐

🎯 目标


1️⃣ 注解定义

@Target(ElementType.METHOD)@Retention(RetentionPolicy.RUNTIME)public@interfaceLog{Stringvalue();}

2️⃣ 业务方法

publicclassUserService{@Log("执行登录逻辑")publicvoidlogin(){System.out.println("login...");}}

3️⃣ 反射处理器(核心)

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);}}}}

4️⃣ 调用

LogProcessor.process(newUserService());

🎉一个注解驱动功能完成


七、进阶:注解 + 反射的 5 个高级用法

1️⃣ 参数校验(Hibernate Validator 原理)

@NotNull@Length(max=20)

2️⃣ 权限控制

@RequireRole("ADMIN")

3️⃣ 自动注入(IOC 雏形)

@InjectprivateUserServiceuserService;

4️⃣ 接口映射(Spring MVC 原理)

@RequestMapping("/login")

5️⃣ 配置替代 XML

约定 > 配置 > 注解


八、注解 vs 接口 vs 抽象类(别搞混)

对比注解接口
是否有逻辑
是否强约束
主要用途元数据行为规范

📌注解不参与继承体系


九、常见坑(面试 + 实战)

1️⃣ 忘记Retention.RUNTIME
2️⃣ 用反射却拿不到注解
3️⃣getMethodvsgetDeclaredMethod混用
4️⃣ 注解不是魔法,没反射=没用
5️⃣ 过度设计,小项目别滥用


十、一句话终极总结(建议背)

注解是标签,反射是解释器
没有反射,注解只是注释


下一步你可以继续冲 🚀

我可以直接带你:

你想往框架原理 / 实战项目 / 面试突击哪个方向继续?

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/9/23 15:07:34

零基础玩转AI修图:fft npainting lama完整操作流程

零基础玩转AI修图&#xff1a;fft npainting lama完整操作流程 你是否曾为一张心爱的照片上突兀的电线、路人、水印或瑕疵而发愁&#xff1f;是否试过用PS反复涂抹却总留下生硬痕迹&#xff1f;现在&#xff0c;无需专业技能、不用复杂参数&#xff0c;只需三步——上传、圈选、…

作者头像 李华
网站建设 2026/9/21 14:07:23

HIPRINT如何用AI重构3D打印工作流

快速体验 打开 InsCode(快马)平台 https://www.inscode.net输入框内输入如下内容&#xff1a; 开发一个基于HIPRINT的AI辅助3D打印系统&#xff0c;要求实现以下功能&#xff1a;1. 自动分析3D模型结构强度并建议优化方案 2. 智能生成最优支撑结构 3. 预测打印可能出现的缺陷…

作者头像 李华
网站建设 2026/9/23 10:10:48

图片预处理有必要吗?配合cv_resnet18_ocr-detection更高效

图片预处理有必要吗&#xff1f;配合cv_resnet18_ocr-detection更高效 在实际OCR文字检测任务中&#xff0c;我们常常遇到这样的困惑&#xff1a;模型已经部署好了&#xff0c;WebUI界面也运行流畅&#xff0c;但上传一张图片后&#xff0c;检测结果却差强人意——要么框不住文…

作者头像 李华
网站建设 2026/9/22 12:06:32

ARM64实战:从X64迁移到ARM架构的5个关键步骤

快速体验 打开 InsCode(快马)平台 https://www.inscode.net输入框内输入如下内容&#xff1a; 创建一个ARM64迁移指南应用&#xff0c;包含以下功能&#xff1a;1) 自动检测X64代码中的架构相关依赖&#xff1b;2) 提供ARM64等效指令替换建议&#xff1b;3) 性能基准测试工具…

作者头像 李华
网站建设 2026/9/20 21:28:16

对比传统SQL:ES数据库在全文检索中的效率优势

快速体验 打开 InsCode(快马)平台 https://www.inscode.net输入框内输入如下内容&#xff1a; 创建一个性能对比测试应用&#xff0c;比较MySQL和Elasticsearch在百万级数据下的全文检索性能。要求&#xff1a;1. 生成包含100万条模拟商品数据&#xff1b;2. 实现相同的搜索功…

作者头像 李华