依赖注入底层反射原理_Spring中的反射与反射的原理,案例详解

本文详细探讨了Spring框架在创建Bean实例和依赖注入时如何使用反射,包括反射在生成Bean、构造方法注入、setter方法注入和@Autowired注解注入中的应用。通过分析`clz.newInstance()`、`Constructor.newInstance()`等关键代码,揭示了反射在获取类信息、执行构造方法和方法调用中的工作原理。此外,还介绍了如何通过反射获取类对象,并列举了常用的反射API。最后,强调了反射与native方法的关系,指出反射是一种运行时获取和修改对象数据的能力。
摘要由CSDN通过智能技术生成

format,png

在造轮子:实现一个简易的 Spring IoC 容器一文中提到 Spring 在创建 Bean 实例和依赖注入时使用了反射,本文来具体分析一下 Spring 中的反射以及反射的原理。

一、Spring 中的反射

1.1、创建 Bean 实例时的反射

// 通过类加载器,根据 class 路径,得到其类对象

Class> clz = Thread.currentThread().getContextClassLoader().loadClass("org.deppwang.litespring.v1.service.PetStoreService");

// 根据类对象生成 Bean 实例

return clz.newInstance();

这里也要注意:光理论是不够的,记住:Java架构项目经验永远是核心,如果你没有最新JAVA架构实战教程及大厂30k+面试宝典,可以去小编的Java架构学习.裙 :七吧伞吧零而衣零伞 (数字的谐音)转换下可以找到了,里面很多新JAVA架构项目教程,还可以跟老司机交流讨教!

反射体现在 clz.newInstance(); 中,核心代码可分为两部分:

1、利用反射获取当前类 PetStoreService 的所有构造方法信息(Constructor 对象)

// java.lang.Class.java

// 调用 native 方法,此时 publicOnly 为 false

res = getDeclaredConstructors0(publicOnly);

// native 方法,从 jvm 中的 class 文件中获取构造方法信息,再转换为 Constructor 对象

private native Constructor[] getDeclaredConstructors0(boolean publicOnly);

复制代码

2、利用反射通过默认构造方法生成实例

// sun.reflect.NativeConstructorAccessorImpl.java

// 调用 native 方法,var1 代表构造方法的参数,此时为 null

return newInstance0(this.c, var1);

// native 方法,真正生成实例的方法,执行 class 文件的构造方法

private static native Object newInstance0(Constructor> var0, Object[] var1);

复制代码

1.2、构造方法依赖注入时的反射

// 通过反射获取当前类所有的构造方法信息(Constructor 对象)

Constructor>[] candidates = beanClass.getDeclaredConstructors();

// 设置构造方法参数实例

Object[] argsToUse = new Object[parameterTypes.length];

argsToUse[i] = getBean(beanNames.get(i));

// 使用带有参数的 Constructor 对象实现实例化 Bean。此时使用反射跟上面一样(newInstance0),只是多了参数

return constructorToUse.newInstance(argsToUse);

复制代码

1.3、setter() 方法依赖注入时的反射

// 通过反射获取当前类所有的方法信息(Method 对象)

Method[] methods = bean.getClass().getDeclaredMethods();

// 获得方法参数实例

Object propertyBean = getBean(propertyName);

// 通过反射执行调用 setter() 方法。invoke:调用方法

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值