使用反射读取字段自定义注解需先获取Field对象并调用getAnnotation(),注意设setAccessible(true)突破访问限制;再根据注解标记识别待注入字段,按类型或名称查找容器中Bean,最后通过field.set()完成依赖注入。

获取字段上的自定义注解值
使用反射读取字段上的注解,核心是先拿到 Field 对象,再调用 getAnnotation(Class
- 通过 Class.getDeclaredFields() 获取所有声明字段(含 private)
- 遍历字段,对每个字段调用 field.getAnnotation(YourAnnotation.class)
- 若返回非 null,说明该字段标注了该注解,可进一步读取其属性值,例如:
YourAnnotation ann = field.getAnnotation(YourAnnotation.class);
String value = ann.value(); // 假设注解有 value() 方法
识别需要注入的字段
通常自定义注解会标记“待注入”字段,比如 @Autowired 或你自己的 @InjectService。反射扫描时只需关注带此注解的字段,并检查其类型是否在容器中存在对应 Bean。
- 字段类型(field.getType())作为 Bean 的查找 key
- 支持按类型查找,也可扩展为按名称 + 类型双匹配(如注解带 name 属性)
- 若容器中无匹配 Bean,可跳过、报错或使用 null/默认值,视设计而定
执行依赖注入
找到目标 Bean 后,用反射将其实例赋值给目标字段。关键点在于处理访问权限和异常。
- 调用 field.setAccessible(true) 允许修改 private 字段
- 调用 field.set(targetObject, beanInstance) 完成赋值
- 捕获 IllegalAccessException 和 IllegalArgumentException 并妥善处理
整合进对象初始化流程
自动注入一般发生在对象创建后、使用前,例如在自定义工厂方法、Spring 的 InstantiationAwareBeanPostProcessor 类似阶段,或简单场景下直接封装为工具方法:
- 接收一个新实例(如 new XxxService())
- 递归扫描该实例所属类及其父类的所有字段
- 对每个带注入注解的字段,查 Bean、设值
- 返回已注入完成的对象










